項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【Python 平行運算 #7】自動化平行任務程式模板 v2,讓系統發揮最大效能,自動分配資源平行運算

前言

此為 multiprocessing 的程式模板v2,(相比 v2 簡化為一支程式)
將任務封裝好後,直接丟入 list_tasks 即可自動發揮系統最大效能跑平行運算。

封裝的概念,請務必先自行理解。

我們通常在設計程式時,都會是預設以單一 process 去執行程式,
但有時候會要重複執行多種任務。

例:跑影片 x 100、分析結果 x 100、雜項任務 x 100…

會需要寫程式的任務,大部分都是需要被反覆執行的,我們正好利用這個特性

multiprocessing.Pool() 會依據系統現在的能力,自動分配任務,
也就是說會讓你的電腦在“接近極限卻不當掉的”情況下,
發揮最大多工的能力。

範例程式碼

  • start_multiprocess.py

請在這邊將所有封裝好的任務存入 list_tasks,(用 list_tasks.append())

例:list_tasks.append(CLASS_NAME(your_args, …))

封裝的任務必須至少包含以下兩個函數:

  • init(): 初始化變數
  • start_progress(): 讓自動化流程分配任務時,開始執行的入口

注意:請勿將 start_progress() 放在 init() 中執行,這樣在宣告階段程式就會先開始跑起來了! 失去了自動分配資源的效果!

import os
import cv2
import glob
import multiprocessing as mp
from multiprocessing import RLock
from tqdm import tqdm
from termcolor import colored

list_tasks = []

# ------------- [YOU ONLY NEED TO SET HERE] ------------- #
# * append your task in to list_tasks 
#   -> list_tasks.append(CLASS_NAME(your_args, ...))
#
# * your CLASS must have at least two functions:
#   -> __init__() and start_progress()
#---------------------------------------------------------#

# put your task here

#---------------------------------------------------------#
#---------------------------------------------------------#
#---------------------------------------------------------#
#---------------------------------------------------------#
#---------------------------------------------------------#

class howard_print(object):
    @staticmethod
    def info(str):
        print(colored(f"[Info] ", 'green') + str)

    @staticmethod
    def warn(str):
        print(colored(f"[Warning] ", 'yellow') + str)

    @staticmethod
    def error(str):
        print(colored(f"[Error] ", 'red') + str)

    @staticmethod
    def finish(str):
        print(colored(f"[Finished] ", 'cyan') + str)

    @staticmethod
    def undefined(str):
        print(colored(f"[Undefined] ", 'magenta') + str)


class multiprocess_task(object):
    def __init__(self, idx, total_job, each_task):
        os.system('cls' if os.name == 'nt' else 'clear')
        howard_print.info(f'Current working on job {idx}/{len(list_tasks)}.')
        each_task.start_progress(total_job)
        howard_print.info(f"job {idx}/{len(list_tasks)} finished !!!")


if __name__ == '__main__':
    tqdm.set_lock(RLock()) # for managing output contention

    cpu_count = mp.cpu_count()
    print(f" --------------------- [start_multiprocess.py] --------------------- ")
    howard_print.info(f"Your CPU count (worker count): {cpu_count}")
    pool = mp.Pool()

    res_list = []
    howard_print.info(f"Total task count = {len(list_tasks)}")
    howard_print.info(f"Task list = {list_tasks}")


    for idx in range(len(list_tasks)):
        res_list.append(pool.apply_async(multiprocess_task, (idx, len(list_tasks), list_tasks[idx])))

    for idx in range(len(res_list)):
        res_list[idx].get()
⭐Python 基礎用法 相關文章整理⭐:
1.【Python】python list 清除, 移除內容元素 remove, pop, del, clear相關用法整理 sample code (內含範例程式碼)
2.【Python】寫模組 module、package 總整理 Importing files from different folder
3.【Python】python assert (斷言) 用法 sample code (內含範例程式碼)
4.【Python】python 一行 if else 語法 (one line if else) sample code (內含範例程式碼)
5.【Python】lambda 與 def function 使用方法與比較整理(內含範例程式碼)
6.【Python】python map 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
7.【Python】python zip 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
⭐Python 字串處理 相關文章整理⭐:
1.【Python】python print 變數的值 & 變數名稱 方法總整理
2.【Python】python string format str.format 總整理
⭐Python 檔案處理 相關文章整理⭐:
1.【Python】python 開關檔範例 與 程式模板 with open / file open sample code
2.【Python】取出檔案名稱 (含副檔名、不含副檔名) os path basename split 取出 檔名 路徑 不要副檔名 sample code
3.【Python】在 python 中利用 os.chmod 更改檔案的權限 chmod 777
4.【Python】利用 shutil 來複製檔案 shutil copy file
5.【Python】python 建立資料夾範例 mkdir os.makedirs() sample code
6.【Python】python 移除資料夾範例 rmdir shutil.rmtree() sample code
7.【Python】確認檔案是否存在 os.path.isfile / 確認資料夾是否存在 os.path.isdir sample code is folder / file exist
⭐Python 系統偵測 相關文章整理⭐:
1.【Python】python pyinotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
2.【Python】python 利用 argparse 使程式執行時可帶參數 (內附範例程式碼) sample code
⭐Python 平行運算 相關文章整理⭐:
1.【Python】threading – 建立多執行緒來執行程式 (內含範例程式碼) sample code
2.【Python】multiprocessing – 01 | 用多核心來執行程式 (內含範例程式碼) sample code
3.【Python】multiprocessing – 02 | pool, map, apply_async – 用多核心來執行程式並取得結果 (內含範例程式碼) sample code
4.【Python】python thread multiprocess 比較總整理
5.【Python】python pooling multiprocess – 用多核心來執行程式 sample code (內含範例程式碼)