All articles, tagged with “threading”

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

В питоне есть модуль 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/