我正在编写一个脚本,它可以与多处理同时处理一些mmaps.Process并更新存储在mmap中并使用互斥锁锁定的结果列表。
我写入结果列表的功能如下所示
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()
这适用于SOMETIMES,但有时,根据进程的执行顺序,似乎result_mmap没有正确调整大小。我不知道从这里看哪里 - 我知道存在竞争条件,但我不知道为什么。
编辑:这是调用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)
答案 0 :(得分:1)
也许我错了,但你确定信号量在进程之间真的有用吗(它是系统互斥体吗?)。因为如果不是,进程不会共享相同的内存空间。您可能要考虑使用的是线程库,以便线程使用相同的信号量。