簡體   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