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

How to thread a function in python that has two returned values

我有一个 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

您可以使用线程池来分配异步任务:

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)

这个模块没有很好的文档记录,但是,基本上,它创建了一个工作池,您可以将子例程分配给它来执行。 apply_async创建的结果对象的方法get()只有在相应的线程完成操作后才会return结果。