Python:如何多线程化一个返回多个值的函数

时间:2017-01-18 04:29:46

标签: python multithreading

我有一个程序,它有两个函数,每个函数返回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()

我了解我可以使用threadthreadingmultiprocessing来实现这一目标。但目前还不清楚如何构造程序以返回结果,或返回多个值。我最初的努力产生了以下结果

使用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]

虽然我希望输出为25,但我得到了错误:

TypeError: 'Thread' object does not support indexing

简而言之,我的问题是:哪个是最适合我的情况的并行化方法/模块,我应该如何构建我的代码以适应它?任何关于我的概念误解的反馈也是受欢迎的。提前谢谢。

1 个答案:

答案 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()