如何在多处理中将锁用作互斥锁?
How to use lock as a mutex in multiprocessing?
我想要两个进程,一个写一个读on/from同一个变量。写入的数据是这样的:
[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()
如您所见,我在写入过程中尝试了锁定和解锁变量,但结果仍然是混乱的。我做错了什么?
这是更正后的版本(归功于 MisterMiyagi)。两个工作人员都在等待对方完成他们的任务,即修改列表或显示列表。
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()
我想要两个进程,一个写一个读on/from同一个变量。写入的数据是这样的:
[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()
如您所见,我在写入过程中尝试了锁定和解锁变量,但结果仍然是混乱的。我做错了什么?
这是更正后的版本(归功于 MisterMiyagi)。两个工作人员都在等待对方完成他们的任务,即修改列表或显示列表。
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()