簡體   English   中英

Python將字典傳遞給多處理中的進程

[英]Python passing dictionary to process in multiprocessing

我有一個包含(大量)不同屬性的類,包括一些字典。 當我將類的實例傳遞給一個新進程時,所有數值似乎都被正確傳遞,但是類對象中的任何字典都被清空了。

這是我編寫的一個簡單測試,用於演示我的問題:

from multiprocessing import Process

class State:
    a = 0
    b = {}

def f(s, i):
    print "f:", s.a, s.b

def main():

    state = State()

    state.a = 11
    state.b['testing'] = 12

    print "Main:", state.a, state.b

    ps = []
    for i in range(1):
        p = Process(target=f, args=(state, i))
        p.start()           # Do the work
        ps.append(p)
    for p in ps:
        p.join()

if __name__ == '__main__':
    main()

我期待輸出

Main: 11 {'testing': 12}
f: 11 {'testing': 12}

但我得到了

Main: 11 {'testing': 12}
f: 11 {}

在多處理模塊的文檔中清楚地描述了該問題:windows缺少fork()系統調用,因此在Windows上,模塊源代碼在每個進程的開始時被重新評估,因此不保留當前狀態。 (在基於un * x的系統上,包括OSX,使用fork實現Process,並保留狀態)

請注意,我在談論整個python模塊的狀態。

你持有狀態的方式是錯誤的: State類的ab成員是類范圍的“靜態”成員,它們不是State對象實例的一部分。 在執行state.a = 11 ,您正在修改State類,而不是類的實例。

如果abState類的實例成員,那么你的代碼可以正常工作:

class State(object):
    def __init__(self)
        self.a = 0
        self.b = {}

然后,將state實例傳遞給新進程,將按預期正確傳遞該值。

我最后解決了這個問題,除了狀態之外還明確地傳遞了字典。 例如

p = Process(target=f, args=(state, i, state.b))

暫無
暫無

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

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