[英]Python - MultiProcessing running only 4 parallel process in 1 CPU core
N = multiprocessing.cpu_count()
with multiprocessing.Pool(processes = N) as p:
for result in user_detail:
arg1 = str(result).replace("[", "\"[")
arg = arg1.replace("]", "]\"")
#For Linux
cmd = 'python3 test.py '
cmd1 = cmd + arg
os.system(cmd + arg + ' &')
我有大約 10 個用戶詳細信息,這個 for 循環將並行調用我的 test.py 文件。 但是一次只有 4 個並行作業在運行。 如何讓所有可用的 10 個用戶並行運行。 在未來 user_detail 計數可能會增加,我希望所有並行運行..
目前我的 cpu_count 是 1。使用帶有 1GB RAM 的 AWS 免費套餐 EC2 實例對其進行測試。
有人請幫助我如何實現使用 python 運行的並行作業。在此先感謝
您已經創建了一個多處理池,但您沒有向它提交任何任務,因為您沒有在您創建的池實例p
上調用任何池提交方法,例如map
或apply_async
。
因為os.system
創建了一個進程,所以你真的只需要使用一個多線程池,它的創建成本更低,池的大小應該是你要提交的任務數量的最小值,即長度user_detail
的數量,以及假設針對test.py運行 Python 解釋器是一個相當 CPU 密集型進程的 CPU 核心數。 如果在編譯test.py之后執行是長時間運行的並且涉及大量的網絡等待,那么池的大小應該正好是您將要提交的任務的數量。
為了更加清晰,我冒昧地重命名了一些變量並簡化了代碼:
from multiprocessing.pool import ThreadPool
from multiprocessing import cpu_count
import os
def run_cmd(cmd):
os.system(cmd)
user_detail = [] # ????
N = min(len(user_detail), cpu_count()) # or N = len(user_detail)
# Use multithreading instead of multiprocessing:
with ThreadPool(N) as pool:
for detail in user_detail:
arg = str(detail).replace('[', '"[').replace(']', ']"')
# For Linux:
cmd = 'python3 test.py ' + arg + ' &'
pool.apply_async(run_cmd, args=(cmd,))
# Wait for all tasks to complete:
pool.close()
pool.join()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.