簡體   English   中英

Python - MultiProcessing 在 1 個 CPU 內核中僅運行 4 個並行進程

[英]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上調用任何池提交方法,例如mapapply_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM