Присвоение возвращаемого значения функции переменной, с многопроцессорной обработкой? И проблема с IDLE?
Я пытаюсь понять многопроцессорность в python.
from multiprocessing import Process
def multiply(a,b):
print(a*b)
return a*b
if __name__ == '__main__':
p = Process(target= multiply, args= (5,4))
p.start()
p.join()
print("ok.")
В этом кодовом блоке, например, была переменная, которая называлась "результат". Как мы можем назначить возвращаемое значение функции умножения на "результат"?
И небольшая проблема с IDLE: когда я пытаюсь запустить этот образец с Python Shell, он работает неправильно? Если я дважды щелкнуть .py файл, вывод будет таким:
20
ok.
Но если я попытаюсь запустить это в IDLE:
ok.
Спасибо...
Ответы
Ответ 1
Хорошо, я как-то справился с этим. Я посмотрел на документацию по Python и узнал, что: используя класс Queue
, мы можем получить возвращаемые значения из функции. И окончательная версия моего кода выглядит следующим образом:
from multiprocessing import Process, Queue
def multiply(a,b,que): #add a argument to function for assigning a queue
que.put(a*b) #we're putting return value into queue
if __name__ == '__main__':
queue1 = Queue() #create a queue object
p = Process(target= multiply, args= (5,4,queue1)) #we're setting 3rd argument to queue1
p.start()
print(queue1.get()) #and we're getting return value: 20
p.join()
print("ok.")
И еще есть функция pipe()
, я думаю, мы тоже можем использовать функцию pipe()
. Но Queue
работал для меня сейчас.
Ответ 2
Это помогает? Это берет список функций (и их аргументы), запускает их параллельно,
и возвращает их результаты. (Это старая версия. Более новая версия на https://gitlab.com/cpbl/cpblUtilities/blob/master/parallel.py)
def runFunctionsInParallel(listOf_FuncAndArgLists):
"""
Take a list of lists like [function, arg1, arg2, ...]. Run those functions in parallel, wait for them all to finish, and return the list of their return values, in order.
(This still needs error handling ie to ensure everything returned okay.)
"""
from multiprocessing import Process, Queue
def storeOutputFFF(fff,theArgs,que): #add a argument to function for assigning a queue
print 'MULTIPROCESSING: Launching %s in parallel '%fff.func_name
que.put(fff(*theArgs)) #we're putting return value into queue
queues=[Queue() for fff in listOf_FuncAndArgLists] #create a queue object for each function
jobs = [Process(target=storeOutputFFF,args=[funcArgs[0],funcArgs[1:],queues[iii]]) for iii,funcArgs in enumerate(listOf_FuncAndArgLists)]
for job in jobs: job.start() # Launch them all
for job in jobs: job.join() # Wait for them all to finish
# And now, collect all the outputs:
return([queue.get() for queue in queues])