使用多进程为变量赋值函数返回值?还有关于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.")
在这个代码块中,比如说有一个叫“result”的变量。我们怎么把multiply函数的返回值赋给“result”呢?
还有一个关于IDLE的小问题:当我尝试在Python Shell中运行这个示例时,它没有正常工作?如果我双击.py文件,输出是这样的:
20
ok.
但是如果我在IDLE中运行这个:
ok.
谢谢...
2 个回答
5
这有帮助吗?这个代码可以接收一系列的函数(还有它们的参数),然后同时运行这些函数,最后返回它们的输出结果。:(这个是旧版本。更新的版本可以在这里找到: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])
13
好的,我总算搞定了这个问题。我查阅了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
对我来说已经很好用了。