包含用于python多处理的字符串的快速共享对象

时间:2013-08-20 15:00:52

标签: python queue multiprocessing

我创建了一些使用python多处理库并行运行的代码。 Schema非常简单:多个worker生成字符串,一个worker消耗和分析字符串。

目前我正在使用多处理队列,它存储字符串,创建如下:

manager = multi.Manager() 
queue = manager.Queue(20)

以这种方式放置/撤回数据:

queue.put(string)
queue.get(timeout = 5)

在htop中进行的一些分析和观察使我得出结论,那些操作对CPU要求很高。

我的问题是,是否有更好(更快)的方式如何在描述的方案中共享一些字符串存储?

请注意,我并不在乎,存储类型是否为FIFO ..但对我来说会更好。

1 个答案:

答案 0 :(得分:1)

操作要求很高,因为他们必须在进程之间进行大量的锁定和通信(请记住Manager会生成一个用于保留共享对象的新进程。)

为了避免这种开销,您应该将通信量降至最低。例如,不是一次发送一个字符串,而是发送一个N字符串序列(每个有效负载的字符串数取决于应用程序,你必须测试一个最适合的字符串)。工作线程可以获取此序列,处理所有字符串并将所有结果放在输出队列中。

从一个简单的微基准测试来看,put()一个对象花费的时间至少是 0.1毫秒。如果对象很复杂,那么时间可以达到几毫秒。如果你要发送非常小的字符串,那么处理它们的时间可能大约是 micro 秒,或大约几十微秒。