繁体   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