繁体   English   中英

如何在不使用multiprocessing.pool的情况下安全地限制no进程的运行

[英]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确定,具体取决于:

  1. 同时运行过程的硬件功能。

  2. 操作系统决定提供资源进行处理”

如果仍要对进程数进行硬编码,则使用信号量受限的进程数是安全的:

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM