Python中Threading模块如何实现子线程与守护线程的详细实例分析?

2026-05-26 21:441阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1646个文字,预计阅读时间需要7分钟。

Python中Threading模块如何实现子线程与守护线程的详细实例分析?

原文示例:本文实例讲述了Python多线程Threading、子线程与守护线程。分享给广大家长供大家参考,具体如下:

Python中Threading模块如何实现子线程与守护线程的详细实例分析?

+ 线程与进程:线程对于进程来说,就像工厂里的工人,分配资源是分配到工厂的,工人再分得资源。

修改后:本文简要介绍了Python的多线程(Threading)、子线程与守护线程。以下为简要内容:

+ 线程与进程:线程相当于工厂中的工人,资源分配到工厂后,工人再分得资源。

本文实例讲述了Python多线程Threading、子线程与守护线程。分享给大家供大家参考,具体如下:

线程与进程:

  • 线程对于进程来说,就好似工厂里的工人,分配资源是分配到工厂,工人再去处理。
  • 线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
  • 在单个程序中同时运行多个线程完成不同的工作,称为多线程
  • 对于IO密集型的程序来说,多线程可以利用读IO的时间去做其他事;
  • 而对于CPU密集型的程序来说,多线程的效率就不是很高了

    补充:IO需要CPU吗?知乎:www.zhihu.com/question/27734728


  • 线程Threading:

    python中多线程需要使用threading模块

    线程的创建与运行:

    1.直接调用threading的Thread类:

    线程的创建:线程对象=thread.Thread(target=函数名,args=(参数))

    线程的启动:线程对象.start(),调用start(),那么线程对象会自动去调用thread.Thread中的run()

    让主线程等待其余线程结束:线程对象.join(),加了join之后,相当于阻塞了主线程,主线程只有当join的线程结束后才会向下执行

    import threading,time def run(n): time.sleep(1) print("task ",n) t1=threading.Thread(target=run,args=("t1",)) t2 = threading.Thread(target=run,args=("t2",)) start_time=time.time()#开始时间 t1.start() t2.start() ##因为是独立线程,如果想要主线程等待其他线程运行完毕,需要使用join t1.join() t2.join() spend_time=time.time()-start_time print(spend_time)##1.0多,说明是并行的结果

    附加说明--join是阻塞等待:

    import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#调用父类的__init__() self.name=name def run(self):#重写方法,按自己的要求去写 time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t2=MyTread("t2") start_time=time.time() t1.start() t2.start() t1.join() t2.join() time.sleep(1)###主线程等待其余线程结束 print(time.time()-start_time) #结果是2.0多,证明是join是相当于阻塞了主线程的执行,只有当线程结束后才会向下执行

    2.继承threading的Thread类:

    继承threading的Thread类的类要主要做两件事:

    1.如果不做自定义变量的初始化,那么可以直接使用继承的父类的__init__(),如果需要做自定义变量的初始化,则需要先调用父类的__init__()

    2.重写run,虽然继承了父类的run,但实际上如果不重写,那么我们继承threading的Thread类又有什么意义呢?为什么不直接调用threading的Thread类

  • import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#调用父类的__init__() self.name=name def run(self):#重写方法,按自己的要求去写 time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t2=MyTread("t2") start_time=time.time() t1.start() t2.start() ###主线程等待其余线程结束 t1.join() t2.join() print(time.time()-start_time)#结果是1.0多,证明是并行的


    子线程:

    • 由一个线程启动的线程可以成为它的子线程,A启动B,B是A的子线程,A是B的父线程


    线程的几个常用函数:

    • threading.current_thread():

    返回当前正在运行的线程对象

    • threading.active_count():

    返回当前进程中的存活的线程对象数

    • 线程对象.isAlive()方法判断线程是否存活

    • getName(): 返回线程名。
    • setName(): 设置线程名。

  • get_ident():获取当前线程ID。


    守护线程:

    • 守护线程是起到辅助功能的,就好像魔法师放禁咒总要骑士保护一样
    • 而守护线程与主线程的关系呢,就好像备胎跟女神,去买东西的话,备胎要一直在外面等女神,女神不需要等待备胎
    • 与join的区别:join是阻塞等待,守护线程是并行的等待
    • 设置守护线程:线程对象.setDaemon(True)

    下面的代码显示了主线程并不会等待其守护线程结束:

    import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print("守护线程已经启动",self.name) time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t1.setDaemon(True) t2=MyTread("t2") t2.setDaemon(True) start_time=time.time()#开始时间 t1.start() t2.start() spend_time=time.time()-start_time print(spend_time)##0.0多,而且三个线程都执行完毕了,说明这个是并行的等待

    让主线程sleep一下,显示一下如果主线程要等待守护线程,那么是并行的等待:

    import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print("守护线程已经启动",self.name) time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t1.setDaemon(True) t2=MyTread("t2") t2.setDaemon(True) start_time=time.time()#开始时间 t1.start() t2.start() time.sleep(2) spend_time=time.time()-start_time print(spend_time)##2.0多,而且三个线程都执行完毕了,说明这个是并行的等待

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

本文共计1646个文字,预计阅读时间需要7分钟。

Python中Threading模块如何实现子线程与守护线程的详细实例分析?

原文示例:本文实例讲述了Python多线程Threading、子线程与守护线程。分享给广大家长供大家参考,具体如下:

Python中Threading模块如何实现子线程与守护线程的详细实例分析?

+ 线程与进程:线程对于进程来说,就像工厂里的工人,分配资源是分配到工厂的,工人再分得资源。

修改后:本文简要介绍了Python的多线程(Threading)、子线程与守护线程。以下为简要内容:

+ 线程与进程:线程相当于工厂中的工人,资源分配到工厂后,工人再分得资源。

本文实例讲述了Python多线程Threading、子线程与守护线程。分享给大家供大家参考,具体如下:

线程与进程:

  • 线程对于进程来说,就好似工厂里的工人,分配资源是分配到工厂,工人再去处理。
  • 线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
  • 在单个程序中同时运行多个线程完成不同的工作,称为多线程
  • 对于IO密集型的程序来说,多线程可以利用读IO的时间去做其他事;
  • 而对于CPU密集型的程序来说,多线程的效率就不是很高了

    补充:IO需要CPU吗?知乎:www.zhihu.com/question/27734728


  • 线程Threading:

    python中多线程需要使用threading模块

    线程的创建与运行:

    1.直接调用threading的Thread类:

    线程的创建:线程对象=thread.Thread(target=函数名,args=(参数))

    线程的启动:线程对象.start(),调用start(),那么线程对象会自动去调用thread.Thread中的run()

    让主线程等待其余线程结束:线程对象.join(),加了join之后,相当于阻塞了主线程,主线程只有当join的线程结束后才会向下执行

    import threading,time def run(n): time.sleep(1) print("task ",n) t1=threading.Thread(target=run,args=("t1",)) t2 = threading.Thread(target=run,args=("t2",)) start_time=time.time()#开始时间 t1.start() t2.start() ##因为是独立线程,如果想要主线程等待其他线程运行完毕,需要使用join t1.join() t2.join() spend_time=time.time()-start_time print(spend_time)##1.0多,说明是并行的结果

    附加说明--join是阻塞等待:

    import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#调用父类的__init__() self.name=name def run(self):#重写方法,按自己的要求去写 time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t2=MyTread("t2") start_time=time.time() t1.start() t2.start() t1.join() t2.join() time.sleep(1)###主线程等待其余线程结束 print(time.time()-start_time) #结果是2.0多,证明是join是相当于阻塞了主线程的执行,只有当线程结束后才会向下执行

    2.继承threading的Thread类:

    继承threading的Thread类的类要主要做两件事:

    1.如果不做自定义变量的初始化,那么可以直接使用继承的父类的__init__(),如果需要做自定义变量的初始化,则需要先调用父类的__init__()

    2.重写run,虽然继承了父类的run,但实际上如果不重写,那么我们继承threading的Thread类又有什么意义呢?为什么不直接调用threading的Thread类

  • import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#调用父类的__init__() self.name=name def run(self):#重写方法,按自己的要求去写 time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t2=MyTread("t2") start_time=time.time() t1.start() t2.start() ###主线程等待其余线程结束 t1.join() t2.join() print(time.time()-start_time)#结果是1.0多,证明是并行的


    子线程:

    • 由一个线程启动的线程可以成为它的子线程,A启动B,B是A的子线程,A是B的父线程


    线程的几个常用函数:

    • threading.current_thread():

    返回当前正在运行的线程对象

    • threading.active_count():

    返回当前进程中的存活的线程对象数

    • 线程对象.isAlive()方法判断线程是否存活

    • getName(): 返回线程名。
    • setName(): 设置线程名。

  • get_ident():获取当前线程ID。


    守护线程:

    • 守护线程是起到辅助功能的,就好像魔法师放禁咒总要骑士保护一样
    • 而守护线程与主线程的关系呢,就好像备胎跟女神,去买东西的话,备胎要一直在外面等女神,女神不需要等待备胎
    • 与join的区别:join是阻塞等待,守护线程是并行的等待
    • 设置守护线程:线程对象.setDaemon(True)

    下面的代码显示了主线程并不会等待其守护线程结束:

    import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print("守护线程已经启动",self.name) time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t1.setDaemon(True) t2=MyTread("t2") t2.setDaemon(True) start_time=time.time()#开始时间 t1.start() t2.start() spend_time=time.time()-start_time print(spend_time)##0.0多,而且三个线程都执行完毕了,说明这个是并行的等待

    让主线程sleep一下,显示一下如果主线程要等待守护线程,那么是并行的等待:

    import threading,time class MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print("守护线程已经启动",self.name) time.sleep(1) print("run in task",self.name,threading.current_thread(),threading.active_count()) t1=MyTread("t1") t1.setDaemon(True) t2=MyTread("t2") t2.setDaemon(True) start_time=time.time()#开始时间 t1.start() t2.start() time.sleep(2) spend_time=time.time()-start_time print(spend_time)##2.0多,而且三个线程都执行完毕了,说明这个是并行的等待

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。