企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 ## 二 开启线程的两种方式 ### **方式一:直接使用** ~~~ from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('egon',)) t.start() print('主线程') ~~~ ### **方式二:自定义类** ~~~ from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): time.sleep(2) print('%s say hello' % self.name) if __name__ == '__main__': t = Sayhi('egon') t.start() print('主线程') ~~~ ## **守护线程与守护进程** 无论是进程还是线程,都遵循:守护xxx会等待主xxx**运行完毕**后被销毁 需要强调的是:运行完毕并非终止运行 ### **运行完毕的解释** 1. 对主进程来说 运行完毕指的是主进程代码运行完毕 2. 对主线程来说 运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 ### **守护xx的详细解释:** 1. 守护进程: 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, 2. 守护线程 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收) 因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,所以主线程必须保证非守护线程都运行完毕后才能结束。 ### 代码验证 ~~~ from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('egon',)) t.setDaemon(True) #必须在t.start()之前设置 t.start() print('主线程') print(t.is_alive()) ~~~ 执行结果 ~~~ 主线程 True ~~~ ## Thread对象的其他属性或方法 ### Thread实例对象的方法 * isAlive(): 返回线程是否活动的。 * getName(): 返回线程名。 * setName(): 设置线程名。 ### threading模块提供的一些方法: * threading.currentThread(): 返回当前的线程变量。 * threading.enumerate(): 返回一个包含正在运行的线程的list。 * threading.activeCount(): 返回正在运行的线程数量 **验证** ~~~ from threading import Thread import threading,os from multiprocessing import Process def work(): import time time.sleep(3) print(threading.current_thread().getName()) if __name__ == '__main__': t=Thread(target=work) t.start() print(threading.current_thread().getName()) print(threading.current_thread()) #主线程 print(threading.enumerate()) #连同主线程在内有两个运行的线程 print(threading.active_count()) print('主线程/主进程') ~~~ 执行结果 ~~~ MainThread <_MainThread(MainThread, started 140735268892672)> [<_MainThread(MainThread, started 140735268892672)>, <Thread(Thread-1, started 123145307557888)>] 主线程/主进程 Thread-1 ~~~ ### **join方法等待子线程结束** 同多进程一样,如果想要子进程结束后主线程再继续,就用jion方法 ~~~ from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('egon',)) t.start() t.join() print('主线程') print(t.is_alive()) ~~~ 执行结果 ~~~ egon say hello 主线程 False ~~~