Pool.map需要将callable作为其第一个参数,并将iterable作为其第二个参数(请参阅Python Docs)。
它将以块的形式拆分iterable并将它们传递给池中的worker。
如果迭代本身是一个生成器,那可能吗?或者它必须是一个序列(list,np.array等)
答案 0 :(得分:3)
发电机工作得很好,但是如果工作急切地发送,它必须以某种方式有效地实现整个发电机才能真正完成工作。事实上,the implementation of Pool.map
list
-ifies any iterable
without __len__
在实际开始调度工作之前,所以传递生成器只是意味着在它被迫在内存中实现生成器之前会有一点延迟。
如果你想避免这种情况,可以使用imap
或imap_unordered
,这两者都会发送“直播”(尽管目前他们都是dispatch well ahead of the results being returned,所以你可能会最终意识到发电机一下子,如果不是全部的话。)