我想有两个进程,一个写入,一个读取同一个变量。写入的数据是这样的:
[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 multiprocessing
def 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 += 1
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,))
p1.start()
p2.start()
p1.join()
p2.join()
如您所见,我试图在编写过程中锁定和解锁变量,但结果仍然混淆了。我做错了什么?
这是更正后的版本(归功于宫城先生(。两个工作人员都在等待对方完成他们的任务,即修改列表或显示它。
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()