我有一个包含进程对象的列表,我只希望它们中的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")
答案 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确定,具体取决于:
同时运行进程的硬件功能。
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)))
希望这会有所帮助。