为了账号安全,请及时绑定邮箱和手机立即绑定

如何在多处理中使用锁作为互斥锁?

如何在多处理中使用锁作为互斥锁?

扬帆大鱼 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 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信