многопроцессорная обработка функции * args i - PullRequest
0 голосов
/ 22 октября 2019

Может кто-нибудь помочь мне запустить функцию foo () параллельно вместо использования цикла for, как описано ниже?

def foo(a,b,c):
    print(a+ " | Process: {}".format(b))
    d = b*c
    print("test multiplication: {}".format(d))
    print('')

a = "Hello World"
c = 2

for i in range(5):    
    b = 1 + i  
    args = [a,b,c]    
    foo(*args)

Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Создайте Thread, инициализируя параметры target и args с помощью функции для запуска и ее аргументов. Вызовите .start(), чтобы запустить его, и .join(), чтобы дождаться его завершения:

from threading import Thread

def foo(a,b,c):
    print(a+ " | Process: {}".format(b))
    d = b*c
    print("test multiplication: {}".format(d))
    print('')

threads = [Thread(target=foo,args=('Hello World',i+1,2)) for i in range(5)]

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

Выход:

Hello World | Process: 1
test multiplication: 2

Hello World | Process: 2
test multiplication: 4
Hello World | Process: 3

test multiplication: 6
Hello World | Process: 4

test multiplication: 8Hello World | Process: 5

test multiplication: 10

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

0 голосов
/ 22 октября 2019

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

import threading
def foo(a,b,c):
    print(a+ " | Process: {}".format(b))
    d = b*c
    print("test multiplication: {}".format(d))
    print('')
x = threading.Thread(target=foo, args=(1,2,3))
x.start()

Создать потоки или использовать модуль multiprocessing для создания рабочего пула.

...