【问题标题】:How to thread a function in python that has two returned values如何在具有两个返回值的python中线程化一个函数
【发布时间】:2017-02-12 20:45:25
【问题描述】:

我有一个 python 函数,需要用户输入一个数据数组;此时函数处理数据并生成两个数组,这些数组返回给主程序。在这个问题中,我提供了一个非常简化的示例,希望可以从中寻求一些建议或帮助。我创建了一个名为“Test_Function”的函数,它要求程序员提供一个名为“Array”的数据数组,在这种情况下,它的长度为 5000。该函数处理数据并生成两组名为“Result1”的数组和在主程序中作为变量“Res1”和“Res2”返回给用户的“Result2”。我想对函数进行线程化,以便函数“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

【问题讨论】:

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


    【解决方案1】:

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

    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()方法只有在对应线程完成操作后才会返回结果。

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 2012-04-02
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2019-03-29
      • 2019-11-10
      相关资源
      最近更新 更多