前言:
如今朋友们对“python获取当前线程”大约比较关怀,同学们都需要学习一些“python获取当前线程”的相关知识。那么小编也在网络上网罗了一些有关“python获取当前线程””的相关内容,希望姐妹们能喜欢,姐妹们一起来了解一下吧!点击上方“python学习专栏”,选择“置顶公众号”
干货、福利第一时间送达!
如何开启多线程?
1、定义自己的函数
2、加入线程
3、启动线程
4、等待线程结束
看下面的代码
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() 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