Состояние гонки с 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 ответ

Решение

Может быть, я ошибаюсь, но вы уверены, что семафор действительно работает между процессами (системный мьютекс?). Потому что, если это не так, процессы не разделяют одно и то же пространство памяти. Возможно, вы захотите рассмотреть использование библиотеки потоков, чтобы потоки могли использовать один и тот же семафор.

Другие вопросы по тегам