簡體   English   中英

python多處理鎖定問題

[英]python multiprocessing lock issue

我想添加一個dicts列表和python多處理模塊。

這是我的代碼的簡化版本:

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

import multiprocessing
import functools
import time

def merge(lock, d1, d2):
    time.sleep(5) # some time consuming stuffs
    with lock:
        for key in d2.keys():
            if d1.has_key(key):
                d1[key] += d2[key]
            else:
                d1[key] = d2[key]

l = [{ x % 10 : x } for x in range(10000)]
lock = multiprocessing.Lock()
d = multiprocessing.Manager().dict()

partial_merge = functools.partial(merge, d1 = d, lock = lock)

pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes = pool_size)
pool.map(partial_merge, l)
pool.close()
pool.join()

print d
  1. 運行此腳本時出現此錯誤。 我該如何解決這個問題?

    RuntimeError: Lock objects should only be shared between processes through inheritance

  2. 在這種情況下需要lock merge功能嗎? 或者python會照顧它嗎?

  3. 我認為map應該做的是將某個列表中的某些內容映射到另一個列表,而不是將一個列表中的所有內容轉儲到單個對象中。 那么有更優雅的方式來做這些事情嗎?

以下內容應該在Python 2和3中跨平台運行(即在Windows上運行)。它使用進程池初始化程序將manager dict設置為每個子進程中的全局。

供參考:

  • 經理字典不需要使用鎖定。
  • Pool的進程數默認為CPU計數。
  • 如果您對結果不感興趣,可以使用apply_async而不是map
import multiprocessing
import time

def merge(d2):
    time.sleep(1) # some time consuming stuffs
    for key in d2.keys():
        if key in d1:
            d1[key] += d2[key]
        else:
            d1[key] = d2[key]

def init(d):
    global d1
    d1 = d

if __name__ == '__main__':

    d1 = multiprocessing.Manager().dict()
    pool = multiprocessing.Pool(initializer=init, initargs=(d1, ))

    l = [{ x % 5 : x } for x in range(10)]

    for item in l:
        pool.apply_async(merge, (item,))

    pool.close()
    pool.join()

    print(l)
    print(d1)

暫無
暫無

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

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