Запустите много функций параллельно и соберите все результаты в список - PullRequest
4 голосов
/ 22 марта 2012

У меня очень интенсивная загрузка процессора:

def entity_intersections(ent, collidable):
    intersections = []

    for line1, line2 in product(ent.shape, collidable.shape):

        pair_intersections = find_intersections(line1 + ent.position, ent.velocity, ent.acceleration, line2 + collidable.position, collidable.velocity, collidable.acceleration, ent, collidable)
        intersections.extend(pair_intersections)

    return intersections

Я хочу, чтобы все вызовы find_intersections выполнялись параллельно, чтобы они выполнялись быстрее, при этом все результаты собирались вместе (после завершения всех выполнений). Какая библиотека позволит мне сделать это, учитывая, что find_intersections является чистой функцией ?

Пример того, как генерировать эти параллельные выполнения, а также собирать воедино результаты, был бы очень признателен.

Ответы [ 2 ]

8 голосов
/ 22 марта 2012

Самый простой способ - использовать модуль multiprocessing:

class FindIntersectionsWrapper(object):
    def __init__(self, ent, collidable):
        self.ent = ent
        self.collidable = collidable
    def __call__(self, dims):
        line1, line2 = dims
        return find_intersections(
            line1 + self.ent.position, self.ent.velocity,
            self.ent.acceleration, line2 + self.collidable.position,
            self.collidable.velocity, self.collidable.acceleration, 
            self.ent, self.collidable)

def entity_intersections(ent, collidable):
    find_inter = FindIntersectionsWrapper(ent, collidable)
    pool = multiprocessing.Pool()
    return pool.map(find_inter, product(ent.shape, collidable.shape))

Вспомогательная функция find_intersections_wrapper() необходима, поскольку Pool.map() ожидает функцию с одним аргументом.

Возможно, вы захотите переместить создание pool из entity_intersections(), чтобы накладные расходы генерировались только один раз.

Редактировать : Использовать класс вместо замыкания, поскольку передаваемый в Pool.map() вызываемый объект должен быть доступен для выбора в Windows.

0 голосов
/ 22 марта 2012

Вы должны использовать threading класс

http://docs.python.org/library/threading.html#module-threading

На этой странице есть несколько хороших примеров: http://www.tutorialspoint.com/python/python_multithreading.htm

...