2012-06-08 2 views
1

У меня есть программа, которая должна выполнять множество запросов по сети, поэтому я занимаюсь распараллеливанием работы. Это действительно I/O-ограниченным, я просто делаю:динамически меняет число параллельных потоков.

for i in range(options.workers): 
    w = Worker(queue, output_queue, options.site) 
    w.setDaemon(True) 
    w.start() 

for i, dataset_metadata in enumerate(datasets_metadata): 
    queue.put((i+1, dataset_metadata)) 

queue.join() 

options.workers приходит из командной строки. Теперь я хочу динамически изменять количество работ.

Первый вопрос: как добавить работников после queue.join?

Второй вопрос: как оценить оптимальное количество рабочих во время выполнения? Я думаю, что я должен следить за задачами/временем скорости, увеличивать число рабочих, пока это соотношение не изменится.

+0

Убедитесь, что вы понимаете недостатки использования потоков с помощью python. Читайте о [GIL] (http://wiki.python.org/moin/GlobalInterpreterLock). – Vikas

+0

@Vikas: как я уже сказал, моя проблема ограничена I/O –

ответ

1

Вы, наверное, могли бы начать и остановить ваши работники самостоятельно, но большую часть функциональности вам нужно, это, вероятно, уже доступны:

  • multiprocessing.dummy модуль экспортирует и тот же интерфейс, как multithreading, реализован только с потоками, а не процессов.
    Это означает, что вы уже можете использовать Pool рабочих, и это облегчит переход от потоковой обработки к многопроцессорной обработке, если это необходимо в какой-то момент.
  • API concurrent.futures предлагает еще более совершенную модель параллелизма. Он находится в стандартной библиотеке в python3.2 +, но для более ранних версий есть backports.
Смежные вопросы