Правильно использовать ThreadPool с генераторами
У меня проблемы с использованием ThreadPool
с Generator
при обработке файла CSV в Python 2.7. Вот пример кода, который иллюстрирует мою точку зрения:
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 ответ
Вот твоя проблема
for batch in batchGenerator:
threadPool.map(processBatch, (batch,))
когда я пытался
threadPool.map(processBatch, batchGenerator)
все заработало как положено (но не по порядку). Цикл for использует threadPool для обработки каждого пакета по одному. так что он заканчивает один, затем двинулся дальше, потом...