亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何在多處理中使用鎖作為互斥鎖?

如何在多處理中使用鎖作為互斥鎖?

揚帆大魚 2022-08-02 18:33:32
我想要兩個過程,一個寫入,一個讀取/從同一變量讀取。寫入的數據如下所示:[0, 0][0, 1][1, 0][1, 1][2, 0][2, 1][3, 0][3, 1][4, 0][4, 1][5, 0][5, 1][6, 0][6, 1][7, 0][7, 1][8, 0][8, 1][9, 0][9, 1]但是我遇到了麻煩,因為讀取過程是在變量變化之間讀取,形成新的對,所以我想使用Lock/Mutex來防止這種情況再次發生。我想我必須在更改對象之前鎖定它。OBS:使用管理器在進程之間共享對象。下面是主代碼:import multiprocessingdef mde(dad, mutex):    for i in range(10):        for j in range(2):            mutex.acquire()            dad[0] = i            dad[1] = j            mutex.release()def mda(dad):    c = 0    while c < 30:        print(dad)        c += 1if __name__ == '__main__':    manager = multiprocessing.Manager()    mutex = manager.Lock()    dado = manager.list([0, 0])    p1 = multiprocessing.Process(target=mde, args=(dado, mutex,))    p2 = multiprocessing.Process(target=mda, args=(dado,))    p1.start()    p2.start()    p1.join()    p2.join()如您所見,我試圖在編寫過程中鎖定和解鎖變量,但結果仍然很混亂。我做錯了什么?
查看完整描述

1 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

這是更正后的版本(歸功于宮城先生)。兩個工人都在等待對方完成他們的任務,即修改列表或顯示它。


import multiprocessing


NX = 10

NY = 2



def mde(dad, mutex):

    for i in range(NX):

        for j in range(NY):

            mutex.acquire()

            dad[0] = i

            dad[1] = j

            mutex.release()



def mda(dad, mutex):

    c = 0

    while c <= NX*NY:

        mutex.acquire()

        print(dad)

        c += 1

        mutex.release()


if __name__ == '__main__':

    manager = multiprocessing.Manager()

    mutex = manager.Lock()

    dado = manager.list([0, 0])

    p1 = multiprocessing.Process(target=mde, args=(dado, mutex,))

    p2 = multiprocessing.Process(target=mda, args=(dado, mutex,))

    p1.start()

    p2.start()

    p1.join()

    p2.join()


查看完整回答
反對 回復 2022-08-02
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號