使用Python进行多处理,锁定变量

时间:2017-03-30 11:35:33

标签: python multiprocessing

我想创建两个进程。他们每个人都写了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')

但我仍然存在一个问题,即一个进程写入的内容,另一个进程将覆盖。

0 个答案:

没有答案