用多处理实现排序生产者/消费者队列

2024-06-08 18:04:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常常见的生产者/消费者场景,有一个转折点。你知道吗

我需要从一个千兆字节的输入流(可能是一个文件或一个HTTP流)中读取几行文本;用一个速度慢且CPU密集的算法处理每一行,为每一行输入输出一行文本;然后将输出行写入另一个流。关键是我需要以与生成输出行的输入行相同的顺序来编写输出行。你知道吗

处理这些场景的通常方法是使用多处理池要运行CPU密集型算法,一个队列从读取器进程传入行(实际上是成批的行),另一个队列从池中引出并进入写入器进程:

                       / [Pool] \    
  [Reader] --> InQueue --[Pool]---> OutQueue --> [Writer]
                       \ [Pool] /

但是如何确保输出行(或批处理)按正确的顺序排序呢?你知道吗

一个简单的答案是,“只需将它们写入临时文件,然后对文件进行排序并将其写入输出”。我可能最终会这样做,但我真的希望尽快开始流式输出行,而不是等待整个输入流从头到尾被处理。你知道吗

我可以很容易地编写自己的多处理队列,它将使用字典(或循环缓冲区列表)、锁和两个条件(可能加上整数计数器)对其项目进行内部排序。但是,我需要从管理器获取所有这些对象,我担心在多个进程之间使用这样的共享状态会降低我的性能。那么,有没有合适的方法来解决这个问题?你知道吗


Tags: 文件方法文本算法字节排序队列进程