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

时间:2018-11-19 16:31:51

标签: python multiprocessing

我有一个包含进程对象的列表,我只希望它们中的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")

1 个答案:

答案 0 :(得分:0)

使用multiprocessing.Pool可能是最明智的选择,deadlock根据系统上可用的最大内核数生成工作进程池,然后在内核可用时基本上将任务馈入。

进程的硬编码数目实际上可能会减慢您的执行速度,更重要的是,存在进程进入fork状态的威胁。

在python中,根据POSIX标准(使用fork)产生了多个进程。在此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. 期间,父线程中除线程外的所有内容都被复制到子进程中。注意共享内存空间以及从父级到子级继承配置。如果您有兴趣,请详细了解-How can I inherit parent logger when using Python's multiprocessing? Especially for paramiko

p = multiprocessing.pool(999999)

pool = multiprocessing.Semaphore(4) # no of cpus of your system. 这样的硬编码在任何机器上都可能因磨磁盘和读取RAM而遭受灾难性的死亡。

进程数应始终由Python确定,具体取决于:

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

  2. OS决定提供资源进行处理'

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

categoriesToFind = ['019301948109', '1309183912309']
d = [{'category1': '0120391123123'}, [{'subcategory': '0120391123123'}, [{'subsubcategory': '019301948109'}, [{'subsubsubcategory': '013904123908'}, [{'subsubsubsubcategory': '019341823908'}]]]], [{'subcategory2': '0934810923801'}, [{'subsubcategory2': '09341829308123'}]], [{'category2': '1309183912309'}, [{'subcategory': '10293182094'}]]]
def get_subcategories(_d, _flag):
   flag = None
   for i in _d:
     if isinstance(i, dict):
       _val = list(i.values())[0]
       if _val in categoriesToFind or _flag:
         yield _val
         flag = True
     else:
        yield from get_subcategories(i, _flag or flag)

print(list(get_subcategories(d, False)))

希望这会有所帮助。