[英]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.