[英]Python pool spawining pools
我有一個函數使用multiprocessing.Pool
並行處理一個數據集中的所有數據。
from multiprocessing import Pool
...
def func():
...
p = Pool(processes=N)
p.map(func, params)
...
但是,我現在要針對M
不同的數據集並行運行它。 因此,我在上面現有的腳本之上編寫了另一個腳本。 我再次嘗試使用Pool
創建M
進程(每個進程都會生成N
進程的Pool
)。 但是,我收到一個有關守護程序無法產生孩子的錯誤(這聽起來很搖滾)。 因此,我進行了一些閱讀,並退出了Pool
因為對multiprocessing.pool.ThreadPool
不太了解。 所以看起來
p = ThreadPool(processes=M)
p.starmap(func, args)
但是,運行此程序時,我看到ThreadPool
只處理一個數據集。 因此,我應該使用什么來生成一個能夠生成M
個子代的腳本,每個腳本都可以生成N
個子代並並行執行。
只需寫出外部Pool並使用Process即可。 由於GIL,線程在Python中的表現很差。
這實際上沒有做任何事情,但是給出了一個主意:
from multiprocessing import Pool, Process
from time import sleep
from random import randint
list = [1,2,3,4,5,6,7]
def worker(a):
print a
sleep(randint(0,2))
def f1(a):
_p = Pool(processes=7)
_p.map(worker, list)
_p.close()
_p.join()
def f2():
processes = []
for _i in list:
p = Process(target=f1, args=(_i,))
p.start()
processes.append(p)
for _q in processes:
q.join()
f2()
它將啟動七個進程,每個進程依次啟動一個池,f2等待所有進程完成。
這是Manager.Queue()
的示例。 (不是我在評論中寫的監控器,我不好)。 如果您將所有鍵盤中斷異常處理都刪除了,試圖使其正常關閉,那么它實際上是一個非常簡單的程序,但是它仍然無法執行。 現在您有了一個外部進程池,該進程又產生了一個池來執行任務。 隊列用於將任務提供給外部池工作程序,而后者又將其提供給工作程序。 他們處於無限循環中,等待某些東西到達隊列中。
當然,您也可以在其中添加控制消息(例如,如果外部池工作程序收到單詞“ exit”,它將關閉其池並正常退出),如果您想管理外部池工作程序並告訴他們做其他事情。
from multiprocessing import Pool, Process
from time import sleep
from random import randint
from multiprocessing import Manager
import sys
alist = [1, 2, 3, 4, 5, 6, 7]
def worker(a):
try:
print a
sleep(randint(0, 2))
except KeyboardInterrupt:
pass
def outer_pool(iq, n):
_ip = Pool(processes=7)
try:
while True:
y = iq.get()
_param = []
for _ny in alist:
_param.append("%d - %d - %d" % (n, _ny, y))
_ip.map(worker, _param)
except KeyboardInterrupt:
try:
_ip.terminate()
except:
pass
c_queue = Manager().Queue()
o_processes = []
for t in alist:
p = Process(target=outer_pool, args=(c_queue, t))
p.start()
o_processes.append(p)
try:
while True:
a = randint(42,100)
c_queue.put(a)
except KeyboardInterrupt:
for _p in o_processes:
try:
_p.terminate()
except:
pass
sys.exit(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.