第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python 3.6+:嵌套多處理管理器導(dǎo)致 FileNotFoundError

Python 3.6+:嵌套多處理管理器導(dǎo)致 FileNotFoundError

烙印99 2022-03-09 21:19:49
所以我試圖在一個(gè)字典上使用多處理管理器,這是我最初的嘗試:from multiprocessing import Process, Managerdef task(stat):    test['z'] += 1    test['y']['Y0'] += 5if __name__ == '__main__':    test = Manager().dict({'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 0, 'Y1': 0}, 'z': 0})    p = Process(target=task, args=(test,))    p.start()    p.join()    print(test)當(dāng)然,當(dāng)我運(yùn)行它時(shí),輸出不是我所期望的,z正確更新而y不變!這是輸出:{'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 0, 'Y1': 0}, 'z': 1}然后我用谷歌搜索,在這里找到了一個(gè)解釋,顯然嵌套的字典也必須是Manager().dict()s 而不是普通的 python 字典(可能從 Python 3.6 開始)。所以我做了以下事情:from multiprocessing import Process, Managerdef task(stat):    test['z'] += 1    test['y']['Y0'] += 5if __name__ == '__main__':    test = Manager().dict({'x': Manager().dict({'X0': 10, 'X1': 20}), 'y': Manager().dict({'Y0': 0, 'Y1': 0}), 'z': 0})    p = Process(target=task, args=(test,))    p.start()    p.join()    print(test)    print(test['y'])但是,我得到了這個(gè)無(wú)法解釋的錯(cuò)誤,而不是它正常工作,為了清楚起見,它分為三個(gè)部分。第一部分對(duì)應(yīng)于,test['y']['Y0'] += 5而第二部分是簡(jiǎn)單的print(test),最后是輸出print(test['y'])我不確定為什么會(huì)這樣。內(nèi)部 dicts 顯然是被創(chuàng)建的(如輸出的第二部分所示)。但是由于某種原因,它們根本無(wú)法讀取或?qū)懭?!為什么?huì)這樣?額外:如果我通過(guò) python 控制臺(tái)(而不是腳本)運(yùn)行相同的 python 代碼,錯(cuò)誤會(huì)FileNotFoundError從ConnectionRefusedError. 但是具有相同的確切回溯!
查看完整描述

1 回答

?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

隨著你每次都開始一個(gè)新的經(jīng)理流程,所以你真的在嵌套經(jīng)理(就像標(biāo)題所說(shuō)的那樣),這不是它應(yīng)該的方式Manager()。Manager().dict()相反,您需要做的是實(shí)例化一個(gè)Manager,然后在該 manager 實(shí)例上創(chuàng)建字典:


from multiprocessing import Process, Manager

from multiprocessing.managers import DictProxy



def task(test):  # use parameter `test`, else you rely on forking

    test['z'] += 1

    test['y']['Y0'] += 5



if __name__ == '__main__':


    with Manager() as m:


        test = m.dict({'x': m.dict({'X0': 10, 'X1': 20}),

                       'y': m.dict({'Y0': 0, 'Y1': 0}),

                       'z': 0})


        p = Process(target=task, args=(test,))

        p.start()

        p.join()


        print(test)

        print(test['y'])


        # convert to normal dict before closing manager for persistence

        # in parent or for printing dict behind proxies

        d = {k: dict(v) if isinstance(v, DictProxy) else v

             for k, v in test.items()}


    print(d) # Manager already closed here

示例輸出:


{'x': <DictProxy object, typeid 'dict' at 0x7f98cdaaa588>, 'y': <DictProxy object, typeid 'dict' at 0x7f98cda99c50>, 'z': 1}

{'Y0': 5, 'Y1': 0}

{'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 5, 'Y1': 0}, 'z': 1}


Process finished with exit code 0

Manager.Lock如果您計(jì)劃從多個(gè)進(jìn)程修改管理器對(duì)象,您還需要使用它。


查看完整回答
反對(duì) 回復(fù) 2022-03-09
  • 1 回答
  • 0 關(guān)注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)