我如何从thread.run获取返回值

时间:2019-09-12 17:46:27

标签: python-3.x multithreading

我正在尝试“保存”函数的返回值(该函数返回整数),但是我获取了None对象

import threading


class SitesThread(threading.Thread):
    def __init__(self, func, searchLine):
        threading.Thread.__init__(self)
        self.func = func
        self.searchLine = searchLine

    def run(self):
        self.func(self.searchLine)


def print1(searchLine):
    print(searchLine, "this is print 1")
    return 1


def print2(searchLine):
    print(searchLine, "this is print 2")
    return 2


def main():
    threads = []
    line = input("pleAS insert a search line")
    t1 = SitesThread(print1, line)
    t2 = SitesThread(print2, line)
    res1 = t1.start()
    res2 = t2.start()
    threads.append(t1)
    threads.append(t2)
    for t in threads:
        t.join()
    print("thread 1 is alive?", t1.isAlive())
    print(res1)
    print("thread 2 is alive?", t2.isAlive())
    print(res2)


if __name__ == "__main__":
    main()

我期望得到: 'searchLine'这是打印1 'searchLine'这是打印2 线程1还活着吗?假 1个 线程2还活着吗?假 2

但是我得到: 我期望得到: 'searchLine'这是打印1 'searchLine'这是打印2 线程1还活着吗?假 没有 线程2还活着吗?假 没有

2 个答案:

答案 0 :(得分:0)

我不确定如何将其返回并放置在res1或2变量中。但是,您仍然可以打印出线程的searchLine部分。看看下面的代码

print("thread 1 is alive?", t1.isAlive())
print(t1.searchLine)
print("thread 2 is alive?", t2.isAlive())
print(t2.searchLine)

这将打印您要搜索的内容...因此,如果您搜索12,它将打印12。

希望这会有所帮助。我将继续研究它,看看是否可以获得与您的预期输出完全匹配的东西。

答案 1 :(得分:0)

到目前为止,看来我无法从运行返回值的函数的线程获得返回值。 因此,如果有人遇到与我相同的问题,一个可选的解决方案是更改函数,而不是返回值,而是可以将值放入全局列表中(确保您确切知道要在列表中的哪个位置保存此值,因此您的其他线程将无法运行它。

另一种解决方案是使用进程而不是线程,但是由于我试图节省时间,并且我的功能全都与API请求有关,因此我了解到在这种情况下线程比进程快。

希望对某人有用。