[英]How to get currently running processes names from multiprocessing module in python
[英]Managing Processes from Python multiprocessing module
所以我以為我最終會發布; 管理Process
工作者的正確方法是什么? 我嘗試使用Pool
,但是我注意到我無法獲得每個已完成過程的返回值。 我嘗試使用回調,但也無法按預期工作。 我應該只用active_children ()
自己管理它們嗎?
我的泳池代碼:
from multiprocessing import *
import time
import random
SOME_LIST = []
def myfunc():
a = random.randint(0,3)
time.sleep(a)
return a
def cb(retval):
SOME_LIST.append(retval)
print("Starting...")
p = Pool(processes=8)
p.apply_async(myfunc, callback=cb)
p.close()
p.join()
print("Stopping...")
print(SOME_LIST)
我期望值列表; 但是我得到的只是工作者工作中要完成的最后一項:
$ python multi.py
Starting...
Stopping...
[3]
注意:答案不應該使用threading
模塊; 原因如下:
在CPython中,由於使用了全局解釋器鎖,因此只有一個線程可以一次執行Python代碼(即使某些面向性能的庫可能克服了此限制)。 如果希望您的應用程序更好地利用多核計算機的計算資源,建議您使用多處理。
您誤會了apply_async
工作方式。 它不會在Pool
中的每個進程中調用您傳遞給它的函數。 它只是在一個工作進程中一次調用函數。 因此,您所看到的結果是可以預期的。 您可以通過兩種方法來獲得所需的行為:
from multiprocessing import Pool
import time
import random
SOME_LIST = []
def myfunc():
a = random.randint(0,3)
time.sleep(a)
return a
def cb(retval):
SOME_LIST.append(retval)
print("Starting...")
p = Pool(processes=8)
for _ in range(p._processes):
p.apply_async(myfunc, callback=cb)
p.close()
p.join()
print("Stopping...")
print(SOME_LIST)
要么
from multiprocessing import Pool
import time
import random
def myfunc():
a = random.randint(0,3)
time.sleep(a)
return a
print("Starting...")
p = Pool(processes=8)
SOME_LIST = p.map(myfunc, range(p._processes))
p.close()
p.join()
print("Stopping...")
print(SOME_LIST)
請注意,您也可以撥打apply_async
或map
比在池中的進程數量更多 。 Pool
的想法是,無論提交多少任務,它都確保num_processes
進程在Pool
的整個生命周期中都將運行。 因此,如果您創建一個Pool(8)
並調用一次apply_async
,則您的八個工作apply_async
一個將獲得任務,而其他七個工作apply_async
將處於空閑狀態。 如果創建Pool(8)
並調用80次apply_async
,則這80個任務將分配給您的8個工作程序,一次實際處理的任務不超過8個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.