Как я могу запустить функцию в двух списках одновременно? - PullRequest
0 голосов
/ 21 апреля 2019

У меня простой вопрос.По сути, я хочу запустить функцию в списке списков одновременно или параллельно.

Вот по сути то, с чем я работаю

def func(x):
    print(x)
for objectList in space:
    for subObject in objectList:
        func(subObject)

В идеале я бы хотелиметь возможность запускать func() на каждом objectList одновременно.Я знаю (на самом деле я не знаю, поэтому я спрашиваю, как это сделать), это многопоточность или параллелизм, но это моя первая попытка сделать это.

Мой вопрос, есть ли модуль иливстроенная функция в python или стандартный способ выполнения этой задачи?

И извините, если я каким-то образом нарушил правило на этом сайте или что-то в этом роде, или вы считаете этот вопрос глупым или дублирующим или что-то в этом роде.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Из документов Python:

объект Pool [...] предлагает удобные средства распараллеливания выполнения функции по нескольким входным значениям, распределяя входные данные по процессам (параллелизм данных)

Вы можете использовать этот шаблон, который также из документов :

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
0 голосов
/ 21 апреля 2019

Как отмечают другие, у вас должна быть действительная точка для использования многопоточности и вычислений parellel, поскольку она также требует от вас других действий, таких как распределение ввода / загрузки и управление работниками (рабочими потоками).Конечно, есть библиотеки, которые встроили эту механику.Для простых приложений вы можете просто использовать (threading.Thread) класс.Вот простой пример использования потоков.Этот код создаст рабочий для каждого элемента пространства.

import threading


def func(x):
    print(x)


class FuncThread(threading.Thread):
    def __init__(self, x):
        threading.Thread.__init__(self)
        self.x = x

    def run(self):
        #worker code = func(x)
        print('doing stuff with:', self.x)


space = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
worker_handlers = list()

for objectList in space:
    for subObject in objectList:
        worker_handlers.append(FuncThread(subObject))

for worker in worker_handlers:
    worker.start()

print('The main program continues to run in foreground.')

for worker in worker_handlers:
    worker.join()  # Wait for the background tasks to finish
print('Main program waited until background was done.')
...