正确地将ThreadPool与Generator一起使用



在Python 2.7中处理CSV文件时,将ThreadPools与Generator一起使用时遇到问题。下面是一些示例代码来说明我的观点:

from multiprocessing.dummy import Pool as ThreadPool
import time
def getNextBatch():
# Reads lines from a huge CSV and yields them as required.
for i in range(5):
yield i;
def processBatch(batch):
# This simulates a slow network request that happens.
time.sleep(1);
print "Processed Batch " + str(batch);
# We use 4 threads to attempt to aleviate the bottleneck caused by network I/O.
threadPool = ThreadPool(processes = 4)
batchGenerator = getNextBatch()
for batch in batchGenerator:
threadPool.map(processBatch, (batch,))
threadPool.close()
threadPool.join()

当我运行这个时,我得到了预期的输出:

已处理批次0

处理批次1

已处理的第2批

处理批次3

已处理的第4批

问题是,它们在每次打印之间都会出现1秒的延迟。实际上,我的脚本是按顺序运行的(而不是像我希望的那样使用多个线程)。

这里的目标是让这些打印出来的语句在大约1秒后全部出现,而不是在5秒内每秒出现一个。

这是的问题

for batch in batchGenerator:
threadPool.map(processBatch, (batch,))

当我尝试时

threadPool.map(processBatch, batchGenerator)

它按预期工作(但不正常)。for循环使用线程池一次处理一个批处理。所以它完成了一个,然后继续,然后。。。

相关内容

  • 没有找到相关文章

最新更新