Распараллеливание заданий

В питоне есть модуль threading, позволяющий одновременно выполнять несколько заданий. Часто бывает так, что количество допустимых потоков меньше, чем количество заданий. Например, при работе с сетью мы упрёмся в ширину канала, при вычислениях мы упрёмся в скорость процессора или в GIL.

Для такой задачи я написал удобный код, суть которого это выполнение X заданий в Y потоков. До изобретения велосипеда я пробовал threadpool библиотеку, но она выдавала странные эксепшны время от времени и я углядел в этом знак свыше — боги одобряют очередной велосипед.

Так появился этот код: http://dumpz.org/8724/. Модуль содержит единственную функцию

def make_work(callback, tasks, limit, results=None):

Для каждого задания запускается callback, одновременно запускается не более, чем limit потоков. Если нужно сохранять выхлоп callback’ов, то создаём объект Queue и передаём в аргументе results. Аргумент tasks может быть или объектом Queue или tuple или list. В последних двух случаях он автоматически преобразовывается в Queue.

UPD: Порефакторенная с учётом заменчаний версия make_work: http://dumpz.org/10066/

Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

multiprocessing.Pool в помощь :) хотя не нити

дпвиз 18.05.2009 17:57

sleep(0.01)

А через семафоры или что там у них в тредах — никак? Или через thread.join()

кстати, чем в цикле гонять и проверять живучесть тредов, лучше использовать метод Queue.join

Всем спасибо за советы — подумаю на досуге.

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image