Pool.map 要求一个可调用对象作为其第一个参数,一个可迭代对象作为其第二个参数(请参阅 Python 文档(。
它将以块的形式拆分可迭代对象,并将它们传递给池中的工作线程。
如果可迭代对象本身是一个生成器,这可能吗?或者它必须是一个序列(列表,np.array等(
发电机工作得很好,但鉴于工作是急切调度的,它必须以一种或另一种方式有效地实现整个生成器才能实际完成工作。碰巧的是,Pool.map
list
的实现 - 在实际开始调度工作之前,无需__len__
任何iterable
,因此传递生成器只是意味着在强制实现内存中的生成器之前有轻微的延迟。
如果你想避免这种情况,请使用imap
或imap_unordered
,两者都是"实时"调度的(尽管目前即使它们在返回结果之前调度,所以你最终可能会一次实现大部分生成器,如果不是全部(。