【问题标题】:How to get a return value from a subroutine run inside a thread [duplicate]如何从线程内运行的子例程获取返回值[重复]
【发布时间】:2018-06-01 03:47:22
【问题描述】:

我在从 python 3 中的线程内运行的子例程中提取返回值时遇到问题。

import threading 
from threading import Thread 
def dothis():
    x = 17
    return x

Thread(target = dothis).start()

print(x)

这只是给我一个错误并说 x 未定义,但我从我的子程序中返回了它。谁能指出我正确的方向?

【问题讨论】:

  • 一个问题是您根本没有收集返回值。即使没有线程,您也必须将返回值分配给 x 以使 x 具有值,因为 x 仅存在于 dothis 函数的范围内。此外,由于您启动了另一个线程,因此您无法知道 dothis 是否在 print(x) 发生之前完成了执行,因为您根本没有与新线程同步。
  • 您可能应该使用队列 - 参见例如this answer 链接的 dup 问题。

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


【解决方案1】:

您似乎想为函数提供输入,同时运行多个线程并获取输出值。像这样的:

import multiprocessing

def dothis(x):
    print x
    #More Code
    return x

if __name__ == '__main__':
    multiprocessing.freeze_support()
    InputsList = [1,2,3,4]
    Processors = 4
    pool = multiprocessing.Pool(Processors)
    Results = pool.map(dothis, InputsList)
    print Results

如前所述,在您的代码中 x 尚未在函数外部定义,这就是您收到此错误的原因。输入必须在您的主函数中定义或定义为全局变量。

您可以将输入列表传递给所需的函数,Results 将包含返回值列表。

【讨论】:

    【解决方案2】:

    x 是一个局部变量。它只存在于dothis 函数的范围内。

    如果你想让它在函数外被访问,你需要把它变成一个全局变量。

    x = 0
    
    def dothis():
        global x
        x = 17
    

    但是,全局变量(不是常量)通常是代码设计不佳的标志,应该避免使用,尤其是线程,因为您可能会遇到多个线程可能试图修改同一个全局变量的竞争条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2018-04-15
      相关资源
      最近更新 更多