如何在python中为具有两个返回值的函数进行线程化

时间:2017-02-12 20:45:25

标签: python multithreading python-2.7 python-3.x python-multithreading

我有一个python函数,需要用户输入数据数组;此时该函数对数据起作用并产生两个返回主程序的数组。在这个问题中,我提供了一个非常简单的例子,希望我可以从中寻求一些建议或帮助。我创建了一个名为“Test_Function”的函数,它要求程序员提供一个标题为“Array”的数据数组,在这种情况下长度为5000.该函数对数据起作用,并生成两组名为“Result1”的数组, “Result2”作为变量“Res1”和“Res2”返回给主程序中的用户。我想将函数线程化,以便函数“Test_Function”使得一个线程将在输入数组的一半上工作而另一个线程将在另一半上工作,然后在主程序中将它们组合在一起用于两个输出数组“Result1”和“Result2”/“Res1”和“Res2”。我描述了一个场景,我将生成两个线程,但我想使它足够通用,以便它可以运行用户定义的线程数。如何使用线程功能执行此操作?

import numpy as np     
def Test_Function(Array):
    Result1 = Array*np.pi*(1-Array)
    Result2 = Array+478.5 + (1/Array)
    return(np.array(Result1,dtype=float), np.array(Result2,dtype=float))
#---------------------------------------------------------------------------
if __name__ == "__main__":
    Dependent_Array = np.linspace(1.0,5000.0,num=5000)
    Res1, Res2 = Test_Function(Dependent_Array)
# eof

1 个答案:

答案 0 :(得分:2)

您可以使用分配异步任务的ThreadPool:

import numpy as np
from multiprocessing.pool import ThreadPool

def sub1(Array):
    return Array * np.pi * (1-Array)

def sub2(Array):
    return Array + 478.5 + (1/Array)

def Test_Function(Array):
    pool = ThreadPool(processes=2)
    res1 = pool.apply_async(sub1, (Array,))
    res2 = pool.apply_async(sub2, (Array,))
    return (np.array(res1.get(),dtype=float), np.array(res2.get(),dtype=float))

if __name__ == "__main__":
    Dependent_Array = np.linspace(1.0,5000.0,num=5000)
    Res1, Res2 = Test_Function(Dependent_Array)

这个模块没有很好的文档记录,但基本上,它创建了一个工作池,您可以为其分配要执行的子例程。 get()创建的结果对象的方法apply_async将仅在相应的线程完成其操作时返回结果。