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