python - 正确使用带生成器的线程池

标签 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()

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

Processed Batch 0

Processed Batch 1

Processed Batch 2

Processed Batch 3

Processed Batch 4

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

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

最佳答案

这是你的问题

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

当我尝试过

threadPool.map(processBatch, batchGenerator)

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

关于python - 正确使用带生成器的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47356159/

相关文章:

java - 太多未使用的阻塞线程的后果

python - PyQt 文档

python - 如何在 Windows 上使用 64 位 Python 调试(可能与 C 库相关的)内存问题?

python - Airflow :如何将读取 json 文件的方法放在本地库中

python - 来自 PySide 子进程的退出信号

java - 为什么主线程没有终止

python - 如何将 DictProxy 对象转换为 JSON 可序列化字典?

c - 将子线程拆分为新的子线程 (Openmp)

python - 获取worker返回的数据

java - ThreadPoolTask​​Executor bean 中的同步队列公平策略?