我创建了一些使用python多处理库并行运行的代码。 Schema非常简单:多个worker生成字符串,一个worker消耗和分析字符串。
目前我正在使用多处理队列,它存储字符串,创建如下:
manager = multi.Manager()
queue = manager.Queue(20)
以这种方式放置/撤回数据:
queue.put(string)
queue.get(timeout = 5)
在htop中进行的一些分析和观察使我得出结论,那些操作对CPU要求很高。
我的问题是,是否有更好(更快)的方式如何在描述的方案中共享一些字符串存储?
请注意,我并不在乎,存储类型是否为FIFO ..但对我来说会更好。
答案 0 :(得分:1)
操作要求很高,因为他们必须在进程之间进行大量的锁定和通信(请记住Manager
会生成一个用于保留共享对象的新进程。)
为了避免这种开销,您应该将通信量降至最低。例如,不是一次发送一个字符串,而是发送一个N
字符串序列(每个有效负载的字符串数取决于应用程序,你必须测试一个最适合的字符串)。工作线程可以获取此序列,处理所有字符串并将所有结果放在输出队列中。
从一个简单的微基准测试来看,put()
一个对象花费的时间至少是 0.1
毫秒。如果对象很复杂,那么时间可以达到几毫秒。如果你要发送非常小的字符串,那么处理它们的时间可能大约是 micro 秒,或大约几十微秒。