簡體   English   中英

Python池Spawining池

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM