龙空技术网

python多线程——获取子线程中的值

有点音乐馆 100

前言:

如今朋友们对“python获取当前线程”大约比较关怀,同学们都需要学习一些“python获取当前线程”的相关知识。那么小编也在网络上网罗了一些有关“python获取当前线程””的相关内容,希望姐妹们能喜欢,姐妹们一起来了解一下吧!

点击上方“python学习专栏”,选择“置顶公众号”

​干货、福利第一时间送达!

如何开启多线程?

1、定义自己的函数

2、加入线程

3、启动线程

4、等待线程结束

看下面的代码

from threading import Threadimport time# 定义一个函数,等待5秒后输出datadef fun():    data = "123"    time.sleep(5)    print(data)    return data​if __name__ == "__main__":    #定义一个线程,target为需要执行的目标函数    T = Thread(target=fun)    # 启动子线程    T.start()    print("结束")​​# 输出结果为# 结束# 123

假设这里不加入多线程,而是直接调用,那么输出应该是

123

结束

分析一下过程,if _name__ == "__main__" 相当于一个主线程,而 T 是我们定义的一个子线程,T.start(),开启子线程。

由于这里没有规定,让主线程等待子线程结束,因此会提前输出 结束

开启主线程等待

from threading import Threadimport time# 定义一个函数,等待5秒后输出datadef fun():    data = "123"    time.sleep(5)    print(data)    return dataif __name__ == "__main__":    #定义一个线程,target为需要执行的目标函数    T = Thread(target=fun)    # 启动子线程    T.start()    # 主线程需要等待子线程结束    T.join()    print("结束")​# 输出结果为# 123# 结束

这里只是简单的讲一下线程的操作

如何获取线程中产生的值

首先需要说一下,在线程中,使用return 返回值是不能实现的,你不能拿到这个值,无论你是否开启线程等待。可以自行尝试一下

想要实现这个功能,有两个方法,

1、重写 Thread

重写 Thread,在内部定义一个获取值的函数

import threadingclass MyThread(threading.Thread):    """重写多线程,使其能够返回值"""    def __init__(self, target=None, args=()):        super(MyThread, self).__init__()        self.func = target        self.args = args​    def run(self):        self.result = self.func(*self.args)    #该函数用于获取返回值,需要开启join    def get_result(self):        try:            return self.result          except Exception:            return None

使用自定义的类来实现

from threading import Threadimport time# 定义一个函数,等待5秒后返回datadef fun():    data = "123"    time.sleep(5)    return dataif __name__ == "__main__":    #定义一个线程,target为需要执行的目标函数    T = MyThread(target=fun)    # 启动子线程    T.start()    # 主线程需要等待子线程结束​    T.join()    # 获取值必须放在 join后面,    print(T.get_result())    print("结束")​# 输出结果为# 123# 结束

join是让主线程等待子线程结束,如果将获取结果放到了主线程join前,此时程序为运行结束,返回值为空

2、使用队列实现

首先定义一个全局队列,将多线程产生的值放到队列中,然后在主线程中获取。

from threading import Threadfrom queue import Queueimport time​# 定义一个全局队列,先进先出队列queue_data = Queue()​# 定义一个函数,等待5秒后输出datadef fun():    data = "123"    time.sleep(5)    # 将数据压入队列    queue_data.put(data)​if __name__ == "__main__":    #定义一个线程,target为需要执行的目标函数    T = Thread(target=fun)    # 启动子线程    T.start()    w = T.join()    print(queue_data.get())    print("结束")# 输出结果为​# 123# 结束

借助concurrent模块,加入线程池中来实现

通过线程池的自带函数获取结果

from threading import Threadfrom queue import Queuefrom concurrent.futures import ThreadPoolExecutorimport time​# 定义一个全局队列,先进先出队列queue_data = Queue()pool = ThreadPoolExecutor()​# 定义一个函数,等待5秒后输出datadef fun():    data = "123"    time.sleep(5)    # 将数据压入队列    queue_data.put(data)    return data    if __name__ == "__main__":    #定义一个线程,target为需要执行的目标函数    t = pool.submit(fun)    print(t.result())    print("结束")# 输出结果为​# 123# 结束

判断线程是否结束

from threading import Threadfrom queue import Queuefrom concurrent.futures import ThreadPoolExecutorimport time​# 定义一个全局队列,先进先出队列queue_data = Queue()pool = ThreadPoolExecutor()​# 定义一个函数,等待5秒后输出datadef fun():    data = "123"    time.sleep(5)    # 将数据压入队列    queue_data.put(data)    return data    if __name__ == "__main__":    #定义一个线程,target为需要执行的目标函数    t = pool.submit(fun)    # 判断线程是否结束    print(t.done())    print("结束")# 输出结果为​# False# 结束

通过判断线程是否结束,采用while循环最终获取结果

如觉得文章排版不适应,可以到我的同名公众号阅读

点赞+关注

END

标签: #python获取当前线程 #python获取当前线程名称 #python 子线程与主线程共享数据