Как синхронизировать мультипроцессорный список событий от родительского до дочернего процесса в режиме реального времени?

У меня есть требование, чтобы получить и воспроизвести файл трассировки (в Python), содержащий транзакции из разных процессов. Мы должны смоделировать исходные сценарии в файле трассировки, поэтому сначала мы разделяем файл трассировки на разные части, в каждой из которых содержатся только транзакции из одного процесса, и воспроизводим их параллельно. И, кроме того, для поддержания одинакового порядка транзакций разных процессов, отраженных в исходной трассировке, в отдельные точки каждой части вставляется серия многопроцессорных примитивов событий для синхронизации между процессами.

Наша программа в основном обрабатывает 2 шага асинхронно, извлекая и воспроизводя. А так как файл трассировки очень большой, мы будем обрабатывать его по частям:

  1. Основной (родительский) процесс извлекает фрагмент файла трассировки по фрагменту. Для каждого чанка будут генерироваться разные фрагменты, и примитивы multiprocessing.Event вставляются для синхронизации между процессами при последующем воспроизведении. Основной процесс поддерживает список Event(), когда бы ни обнаруживалась точка, переплетенная с процессами, список увеличивался с помощью eventList.append(Event()), и на это новое добавленное Event() ссылались бы события EventList [i].set и пара EventList [i].wait, которые вставляются в определенные точки по 2 штуки. Как только первый блок обрабатывается, порождаются дочерние процессы, и фрагменты будут переданы соответствующему дочернему процессу для воспроизведения. Полученные позже куски будут брошены в очередь для соответствующих потомков.

  2. Дочерние процессы порождаются после того, как родительский элемент получает первый чанк. Каждый дочерний процесс воспроизводит один отдельный фрагмент, который содержит транзакции одного и того же процесса.

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

Я понимаю, что список поддержки multiprocessing.Manager может распределять память между различными процессами, но, похоже, этот список не может вместить Event(). Исключение "RuntimeError: объекты семафора должны быть общими только для процессов через наследование" появляется при добавлении Event() в Manager(). List(). Я также попытался автоматически сгенерировать новую переменную eventXX=Manager().Event(), когда это необходимо, но, похоже, это приводит к резкому снижению производительности.

Кто-нибудь знает, как я могу заставить дочерний процесс реализовать такую ​​многопроцессорность. Изменение списка событий в родительском? Или у вас есть другие методы для достижения этой цели?

Заранее спасибо.

0 ответов

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