簡體   English   中英

Python多處理池強制分配過程

[英]Python multiprocessing pool force distribution of process

出現此問題的原因是嘗試將日志記錄與多處理池結合在一起。 在Linux下,無需執行任何操作。 包含我的池工作程序方法的模塊繼承了主應用程序記錄器屬性。 在Windows下,我必須在每個進程中初始化記錄器,這是通過使用initializer方法運行pool.map_async來完成的。 問題在於該方法運行得如此之快,以致於它在某些進程中不止一次執行,而在另一些進程中則根本不執行。 如果在該方法上添加短時間延遲,我可以使其正常工作,但這似乎不太好。

有沒有一種方法可以強制池平均分配進程?

(某些背景: http : //plumberjack.blogspot.de/2010/09/using-logging-with-multiprocessing.html

代碼如下,我不能真正發布整個模塊;-)調用是這樣的:

# Set up logger on Windows platforms
if os.name == 'nt':
    _ = pool.map_async(ml.worker_configurer,
                       [self._q for _ in range(mp.cpu_count())])

ml.worker_configurer函數是這樣的:

def worker_configurer(queue, delay=True):
    h = QueueHandler(queue)
    root = logging.getLogger()
    root.addHandler(h)
    root.setLevel(logging.DEBUG)
    if delay:
        import time
        time.sleep(1.0)
    return

新工作者配置器

def worker_configurer2(queue):
    root = logging.getLogger()
    if not root.handlers:
        h = QueueHandler(queue)
        root.addHandler(h)
        root.setLevel(logging.DEBUG)
    return

您可以執行以下操作:

sub_logger = None

def get_logger():
    global sub_logger
    if sub_logger is None:
        # configure logger

    return sub_logger

def worker1():
    logger = get_logger()
    # DO WORK

def worker2():
    logger = get_logger()
    # DO WORK

pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
result = pool.map_async(worker1, some_data)
result.get()
result = pool.map_async(worker2, some_data)
result.get()
# and so on and so forth

因為每個進程都有自己的內存空間(因此是自己的全局變量集),所以可以將初始全局記錄器設置為“ None並且僅在以前未配置的情況下才配置記錄器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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