2

我需要检索和重放包含来自不同进程的事务的跟踪文件(在 python 中)。我们必须在跟踪文件中模拟原始场景,因此我们首先将跟踪文件分成不同的部分,每个部分只包含来自单个进程的事务并并行重放它们。此外,为了保持原始跟踪中反映的不同进程事务的相同顺序,在每个片段的特定点插入一系列 multiprocessing.Event 原语用于进程间同步。

我们的程序主要异步处理两个步骤,检索和重放。由于跟踪文件非常大,我们将逐块处理它:

  1. 主(父)进程逐块检索跟踪文件。对于每个块,将生成不同的片段,并插入 multiprocessing.Event 原语以在以后的重放中进行进程间同步。主进程维护一个 Event() 列表,每当检测到一个进程交织点时,该列表通过 eventList.append(Event()) 递增,并且这个新附加的 Event() 将被 eventList[i].set 引用,并且eventList[i].wait 对,分两部分插入到特定点。一旦处理了第一个块,就会产生子进程,并且这些片段将被分发到相应的子进程以进行重播。稍后检索到的块将被扔到各个孩子的队列中。

  2. 子进程在父进程检索到第一个块后生成。每个子进程重播一个包含来自同一进程的事务的单个片段。

这里的问题是子进程是在检索到第一个块之后生成的,所以此时的 eventList 将被复制到子进程并且可以同步重播第一个块,但是主进程现在继续处理第二个块,并且为第二个块增加的eventList不会被子进程实现,并且稍后重放第二个块时,程序会失败

我意识到 multiprocessing.Manager 支持列表可以在不同进程之间共享内存,但似乎列表无法容纳 Event()。将 Event() 附加到 Manager().list() 时会弹出异常“RuntimeError:信号量对象只能通过继承在进程之间共享”。我还尝试在需要时自动生成新变量 eventXX=Manager().Event(),但似乎它会导致性能急剧下降。

有人知道我怎样才能让子进程实现这样的多处理。父进程中的事件列表更改?或者您有其他方法可以实现这一目标吗?

提前致谢。

4

0 回答 0