Присваивание возвращаемого значения функции переменной с многопроцессорной обработкой?А проблема с IDLE? - PullRequest
11 голосов
/ 25 августа 2011

Я пытаюсь понять многопроцессорность в 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.

Спасибо ...

Ответы [ 2 ]

13 голосов
/ 27 августа 2011

Хорошо, я как-то справился с этим. Я посмотрел на документацию по 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. Но очередь у меня сработала, сейчас.

5 голосов
/ 07 августа 2012

Это помогает? Это берет список функций (и их аргументы), запускает их параллельно, и возвращает их результаты. (Это старая версия. Гораздо новее версия в 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])
...