Состояние гонки с Python mmap и multiprocessing.semaphore
Я пишу скрипт, который обрабатывает некоторые mmaps одновременно с multiprocessing.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()
Это работает НЕКОТОРЫЕ, но в других случаях, в зависимости от порядка выполнения процессов, кажется, что 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)
1 ответ
Может быть, я ошибаюсь, но вы уверены, что семафор действительно работает между процессами (системный мьютекс?). Потому что, если это не так, процессы не разделяют одно и то же пространство памяти. Возможно, вы захотите рассмотреть использование библиотеки потоков, чтобы потоки могли использовать один и тот же семафор.