正确使用ThreadPool和Generators

时间:2017-11-17 17:24:54

标签: python multiprocessing threadpool python-multiprocessing yield-keyword

在Python 2.7中处理CSV文件时,我在使用ThreadPoolGenerator时遇到问题。以下是一些示例代码,说明了我的观点:

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秒。

1 个答案:

答案 0 :(得分:3)

这是你的问题

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

当我尝试

threadPool.map(processBatch, batchGenerator)

它按预期工作(但不按顺序)。 for循环使用threadPool一次处理每个批处理。所以它完成一个,然后继续前进,然后......