我有一个程序,它有两个函数,每个函数返回2个值。一切都运行良好,没有任何并行化。但是我希望实现的是在自己的线程/进程中运行每个函数。这是程序在并行化之前的样子:
def func1():
x = 2
y =5
return x,y
def func2():
a = 4
b = 3
return a,b
func1ResultX , func1ResultY = func1()
func2ResultA , funct2ResultB = func2()
我了解我可以使用thread
,threading
或multiprocessing
来实现这一目标。但目前还不清楚如何构造程序以返回结果,或返回多个值。我最初的努力产生了以下结果
使用thread
function1ResultX, function1ResultY = thread.start_new_thread(func1)
function2ResultA, function2ResultB = thread.start_new_thread(func2)
结果:
TypeError: 'int' object is not iterable
使用multiprocessing
function1ResultX , function1Resulty = multiprocessing.Process(target=func1)
function2ResultA, function2ResultB = thread.start_new_thread(func2)
结果:
TypeError: 'Process' object is not iterable
使用threading
我看到示例类似于以下内容:
t1 = threading.Thread(target=someFunc)
t1.start()
t1.join()
但我不知道如何修改示例以适应我的函数,该函数返回两个值,我也不清楚如何只返回一个值。
我尝试将我的功能简化为只返回一个这样的值:
def func1():
MyNewList = [2,5]
return MyNewList
并结合使用threading
模块的方法:
MyNewList = threading.Thread(target=func1)
MyNewList.start()
MyNewList.join()
print MyNewList[0]
print MyNewList[1]
虽然我希望输出为2
和5
,但我得到了错误:
TypeError: 'Thread' object does not support indexing
简而言之,我的问题是:哪个是最适合我的情况的并行化方法/模块,我应该如何构建我的代码以适应它?任何关于我的概念误解的反馈也是受欢迎的。提前谢谢。
答案 0 :(得分:1)
您可能希望稍微修改一下您的功能,以便使用 Queue
来获取结果。
import threading, Queue
def func1(queue):
x = 2
y = 5
queue.put((x, y))
queue = Queue.Queue()
new_thread = threading.Thread(target=func1, args=(queue, ))
new_thread.start()
new_thread.join()
x, y = queue.get()