[英]How to safely limit the no process running without using multiprocessing.pool
我有一个包含进程对象的列表,我只希望它们中的100个随时处于活动状态并正在运行,并且在它们完成之后,它们应该从内存中退出,而下一个100个进程应该启动,依此类推。已经在python3中编写了一个演示代码,我想知道它是否有任何问题或限制。
process = [List of process]
while len(process) != 0:
i=0
for i in range (100):
process[0].start()
copy = process[0]
del process[0]
print(process[0])
copy.join()
print("joining")
使用multiprocessing.Pool
可能是最明智的选择multiprocessing.Pool
会根据系统上可用的最大内核数生成一个工作进程池,然后在内核可用时基本上将任务送入。
硬编码进程数实际上可能会减慢执行速度,更重要的是,存在进程进入deadlock
状态的威胁。
在python中,根据POSIX标准(使用fork
)产生了多个进程。 在此fork
期间,父线程中除线程外的所有内容都被复制到子进程中。 注意共享内存空间以及从父级到子级继承配置。 如果您有兴趣,请进一步了解- 使用Python的多处理程序时如何继承父记录器? 特别是对于paramiko
import multiprocessing
def f(name):
print 'hello', name
if __name__ == '__main__':
pool = multiprocessing.Pool() #use all available cores, otherwise specify the number you want as an argument
for i in xrange(0, 512):
pool.apply_async(f, args=(i,)) #process function f asynchronously.
pool.close() #safely close the pool and all associated process.
pool.join() #execute process' in pool.
诸如p = multiprocessing.pool(999999)
类的硬编码可能会在任何计算机上因研磨磁盘和读取RAM而遭受灾难性的死亡。
进程数应始终由Python确定,具体取决于:
同时运行过程的硬件功能。
操作系统决定提供资源进行处理”
如果仍要对进程数进行硬编码,则使用信号量受限的进程数是安全的:
pool = multiprocessing.Semaphore(4) # no of cpus of your system.
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.