【python】 多线程、多进程

什么是多线程?

  在操作系统上,所有的应用程序都是通过进程来运行的。当一个应用程序启动时,操作系统会为该应用程序创建一个或多个进程,并为这些进程分配必要的资源,如内存空间、文件句柄等,以协助应用程序的运行。

在进程内部,可以同时存在多个线程。这些线程共享同一进程的地址空间和其他资源(如文件描述符、已打开的网络连接等),但它们各自拥有独立的执行栈和程序计数器。因此,线程之间的通信和同步变得相对简单,因为它们可以直接访问和修改共享的数据结构。

线程是操作系统调度CPU的基本单位。这意味着操作系统在分配CPU时间片给不同的任务时,是以线程为单位进行的。由于线程之间的切换开销相对较小(因为它们共享同一进程的地址空间),多线程编程可以有效地提高系统的并发性和响应性。

但是,值得注意的是,虽然线程是CPU调度的基本单位,但进程在操作系统中仍然扮演着至关重要的角色。进程是系统资源分配的基本单位,每个进程都有独立的内存空间和系统资源集。因此,进程之间的隔离性更强,一个进程的崩溃通常不会影响其他进程的运行。

【解决问题】怎么可以同时大量处理多个任务?

【解决的办法】多线程(threading模块)、多进程 (multiprocessing模块)两种办法

 多线程(threading模块)

【适用场景】I/0 密集型任务

 多进程 (multiprocessing模块)

 【适用场景】CPU 密集型任务,因为每个进程都有自己的Python解释器和内存空间,会提高计算能力。但是在cpython 中 每个进程中的多个线程会共享同一个

【生命周期】

  新建:新建一个线程对象

  就绪:调用start方法后,线程对象等待运行,什么时候开始运行取决于调度

  运行:线程处于运行状态

  阻塞:处于运行状态的线程被堵塞,通俗理解是被卡柱了,可能是因为程序自身调用sleep方法阻塞线程运行,或调用了一个阻塞式I/O方法,被阻塞的进程会等待何时解除阻塞重新运行

  死亡:线程执行完毕或者异常退出,线程对象被摧毁并释放内存

【问题1】怎么让线程从这main 主线程结束?

【解决】当主线程执行完其所有代码后,Python解释器并不会立即退出。它会等待所有非守护线程完成它们的任务。只有所有非守护线程都结束后,Python解释器才会退出。守护线程则不同,当主线程结束时,守护线程会立即被终止

 1 import threading  
 2 import time  
 3   
 4 def worker():  
 5     """守护线程的工作函数"""  
 6     while True:  
 7         print("Worker thread is running...")  
 8         time.sleep(1)  # 暂停一秒  
 9   
10 if __name__ == "__main__":  
11     # 创建一个守护线程  ,daemon=True
12     t = threading.Thread(target=worker, daemon=True)  
13     t.start()  
14   
15     # 主线程休眠3秒以观察守护线程的行为  
16     print("Main thread is running...")  
17     time.sleep(3)  
18     print("Main thread is exiting...")  
19   
20 # 当主线程退出时,守护线程t会立即被终止,因此你将不会看到"Worker thread is running..."的进一步输出

 

posted on 2024-06-21 11:33  彩屏黑白  阅读(1)  评论(0编辑  收藏  举报

导航