Распараллеливание заданий
В питоне есть модуль 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/






Comments
multiprocessing.Pool в помощь :) хотя не нити
А через семафоры или что там у них в тредах — никак? Или через thread.join()
кстати, чем в цикле гонять и проверять живучесть тредов, лучше использовать метод Queue.join
Всем спасибо за советы — подумаю на досуге.