Python mmap和multiprocessing.semaphore的竞争条件

1 投票
1 回答
1259 浏览
提问于 2025-04-16 20:57

我正在写一个脚本,用来同时处理一些内存映射(mmap),并通过multiprocessing.Process来更新一个存储在mmap中的结果列表,同时用互斥锁(mutex)来保护这个列表。

我用来写入结果列表的函数大概是这样的:

def update_result(result_mmap, new_value, new_value_index, sema):
    sema.acquire()
    result_mmap.seek(0)
    old_result = result_mmap.readline().split("\t")
    old_result[new_value_index] = new_value
    new_result = "\t".join(map(str, old_result))
    result_mmap.resize(len(new_result))
    result_mmap.seek(0)
    result_mmap.write(new_result)
    sema.release()

这个方法有时候能正常工作,但有时候根据进程执行的顺序,结果的mmap似乎没有正确调整大小。我不太确定该从哪里入手——我知道存在竞争条件(race condition),但我不知道具体是为什么。

补充说明:这是调用update_result的函数:

def apply_function(mmapped_files, function, result_mmap, result_index, sema):
    for mf in mmapped_files:
        accumulator = int(mf.readline())
        while True:
            line = mf.readline()
            if line is None or line == '':
                break
            num = int(line)
            accumulator = function(num, accumulator)
        update_result(result_mmap, result_index, inc, sema)

1 个回答

1

我可能理解错了,但你确定信号量在进程之间真的有效吗?它是系统的互斥锁吗?因为如果不是的话,进程之间是不能共享同一块内存的。你可以考虑使用线程库,这样线程就可以使用同一个信号量了。

撰写回答