我想创建两个进程。他们每个人都写了10次 长度为20的数组。两个进程都访问相同的数组。 一个过程尽快写入,另一个过程必须等待一段时间才能写出来。
我的问题是,我无法锁定这些变量以防止竞争条件。 它甚至可以在多核系统上使用吗? 而且我想让阵列充满。在这种状态下,只写入数组的前十个插槽。
这是我的代码:
from multiprocessing import Process, RawValue, RawArray, Value, Array, Lock
from ctypes import c_int
def write1(field):
counter = 0
global position
for position in range(len(field)):
if counter < 10:
field[position] = 1
counter += 1
position += 1
def write2(field):
counter = 0
global position
for position in range(len(field)):
for i in range(40):
if i == (40-1):
if counter < 10:
field[position] = 2
counter += 1
position += 1
if __name__ == '__main__':
field = Array(c_int, range(20), lock = True)
position = Value(c_int, 0, lock = True)
p1 = Process(target=write1,args=(field,))
p2 = Process(target=write2,args=(field,))
p2.start()
p1.start()
p1.join()
p2.join()
print(field[:])
print('done')
修改
我找到了解决方案。我不得不使用一个单独的锁定对象来锁定我的数组。
from multiprocessing import Process, RawValue, RawArray, Value, Array, Lock
from ctypes import c_int
def write1(field, lock):
counter = 0
global position
with lock:
for position in range(len(field)):
if counter < 10:
field[position] = 1
counter += 1
def write2(field, lock):
counter = 0
global position
with lock:
for position in range(len(field)):
for i in range(40):
if i == (40-1):
if counter < 10:
field[position] = 2
counter += 1
if __name__ == '__main__':
lock = Lock()
field = Array(c_int, range(20))
position = Value(c_int, 0)
p1 = Process(target=write1,args=(field,lock))
p2 = Process(target=write2,args=(field,lock))
p2.start()
p1.start()
p1.join()
p2.join()
print(field[:])
print('done')
但我仍然存在一个问题,即一个进程写入的内容,另一个进程将覆盖。