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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python多處理中寫入共享內(nèi)存(列表)的同步

Python多處理中寫入共享內(nèi)存(列表)的同步

人到中年有點甜 2021-09-11 19:14:46
我有以下代碼:import multiprocessingmanager = multiprocessing.Manager()如果列表的長度小于 4,則附加列表或創(chuàng)建一個具有初始值 'y' 的新列表的函數(shù)。def f(my_array):    if len(my_array) < 4:        my_array.append('x')    else:        my_array = ['y']    print(my_array)列表的初始化和創(chuàng)建過程。if __name__ == '__main__':    my_array = manager.list(['a', 'b', 'c'])    p1 = Process(target=f, args=(my_array))    p2 = Process(target=f, args=(my_array))    p3 = Process(target=f, args=(my_array))    p4 = Process(target=f, args=(my_array))    p5 = Process(target=f, args=(my_array))    p1.start()    p2.start()    p3.start()    p4.start()    p5.start()    p1.join()    p2.join()    p3.join()    p4.join()    p5.join()我得到的輸出:['a', 'b', 'c', 'x']['y']['y']['y'] ['y']我不明白為什么列表只附加一次。我希望在第三個輸出行中我會觀察到列表 ['y'] 附加了 'x',所以 ['y', 'x'],第四個 ['y', 'x', 'x']等等。似乎共享內(nèi)存泄漏或不允許多個進程的函數(shù)進行更改。我該怎么做才能實現(xiàn)目標行為?
查看完整描述

1 回答

?
慕桂英4014372

TA貢獻1871條經(jīng)驗 獲得超13個贊

同步是您的示例中缺少的一點。manager.list只是一個list單獨的服務(wù)器進程中的正常情況,您的工作進程可以通過代理對象進行修改。您的進一步流程恰好同時檢查len(my_array)。


沒有同步,這告訴他們應(yīng)該等到另一個進程完成它的操作,包括執(zhí)行此長度檢查并根據(jù)此檢查的結(jié)果執(zhí)行操作。您的更新操作不是原子操作,您需要通過在您的操作周圍使用 manager.lock 來實現(xiàn)它。


您的代碼中還有另一個問題,您重新綁定my_array以指向普通 list ['y'],而不是更新/修改 shared manager.list。你是不是修改manager.list與設(shè)置過程my_array = ['y']中,manager.list保持它的價值['a', 'b', 'c', 'x']通過第一個工作流程,直到程序結(jié)束,從第一個修改。


from multiprocessing import Process, Manager



def f(my_array, lock):

    with lock:

        if len(my_array) < 4:

            my_array.append('x')

        else:

            my_array[:] = []  # clear list inplace by assigning

            # empty list to slice of manager.list

            my_array.append('y')

    print(my_array)



if __name__ == '__main__':


    N_WORKERS = 5


    with Manager() as manager:


        my_array = manager.list(['a', 'b', 'c'])

        lock = manager.Lock()


        pool = [

            Process(target=f, args=(my_array, lock)) for _ in range(N_WORKERS)

        ]


        for p in pool:

            p.start()

        for p in pool:

            p.join()


        # Leaving the context-manager block will shut down the manager-process.

        # We need to convert the manager-list to a normal list in the parent

        # to keep its values available for further processing in the parent.

        result = list(my_array)


    print(f'result: {result}')

示例輸出:


['a', 'b', 'c', 'x']

['y']

['y', 'x']

['y', 'x', 'x']

['y', 'x', 'x', 'x']

result: ['y', 'x', 'x', 'x']


Process finished with exit code 0


查看完整回答
反對 回復(fù) 2021-09-11
  • 1 回答
  • 0 關(guān)注
  • 249 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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