Правильно использовать 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 для обработки каждого пакета по одному. так что он заканчивает один, затем двинулся дальше, потом...

Другие вопросы по тегам