第一章、多线程
一、概述
在Python中,进程和线程都是用于并发执行任务的概念,但它们在实现方式和作用上有所不同。
1、进程(Process)
进程是指计算机中正在运行的程序的实例。每个进程都拥有自己独立的内存空间和系统资源,它们之间相互隔离,彼此独立运行。每个进程都有自己的地址空间、文件描述符、环境变量等。
- 进程是操作系统分配资源的基本单位,每个进程都有自己的内存空间、代码和数据。
- 每个进程在独立的内存空间中运行,它们之间互相隔离,一个进程的崩溃通常不会影响其他进程。
- 进程通常用于执行独立的任务,例如运行独立的应用程序或服务。
- 在 Python 中,可以使用
multiprocessing
模块创建和管理多个进程。每个进程都有自己的 Python 解释器,因此可以充分利用多核处理器。
进程是一个应用程序(1个进程是一个软件)
2、线程(Thread)
线程是在进程内部执行的独立单元,它是进程中的一个执行路径。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。线程之间可以并发执行,共享数据,使得程序可以同时执行多个任务。
- 线程是进程内的执行单元,一个进程可以包含多个线程,它们共享同一进程的内存空间和资源。
- 线程更轻量级,创建和销毁线程的开销较小,线程之间的切换速度较快。
- 线程通常用于执行并发的任务,例如在图形用户界面 (GUI) 应用程序中处理用户输入、执行网络请求等。
- 在 Python 中,可以使用内置的
threading
模块创建和管理线程。Python 中的全局解释器锁(Global Interpreter Lock,GIL)限制了多线程程序在多核处理器上的并行性,因此在 CPU 密集型任务中,多进程可能更适合。
线程是一个进程中的执行场景/执行单元。一个进程可以启动多个线程
对于java程序来说,当在DOS命令窗口中输入:
Python HelloWorld.py 回车之后
会先启动PVM,而PVM就是一个进程。
PVM再启动一个主线程
同时再启动一个垃圾回收线程负责看护,回收垃圾
最起码,现在的Python程序中至少有两个线程并发。一个是垃圾回收线程,一个是主线程
3、进程和线程的关系
阿里巴巴:进程
- 马云:阿里巴巴的一个线程
- 员工A:阿里巴巴的一个线程
京东:进程
- 强东:京东的一个线程
- 员工B:京东的一个线程
进程可以看做是现实生活中的公司;线程可以看作是公司当中的某个员工
注意:
进程A和进程B的内存独立不共享(阿里巴巴和京东资源不会共享)
线程A和线程B:
- 假设启动10个线程,会有10个栈内存空间,每个栈和每个栈之间互不干扰,各自执行各自的,这就是多线程并发
Python 中之所以有多线程机制,目的就是为了提高程序的处理效率
4、线程与进程的主要区别如下:
- 资源占用:进程之间相互独立,每个进程拥有自己的资源。而线程共享进程的资源,包括内存空间、文件等。
- 执行单元:进程是一个程序的执行实例,有自己的独立执行环境。线程是进程内部的执行单元,可以并发执行多个线程。
- 切换开销:线程切换的开销比进程切换要小,因为线程共享同一进程的资源,切换时只需保存和恢复线程的执行上下文。
- 通信和同步:线程之间可以通过共享内存进行通信和数据交换,但也需要考虑线程同步和互斥的问题。进程之间通信相对复杂,需要使用特定的进程间通信机制。
在Python中,多线程编程可以提高程序的并发性能和资源利用率,但也需要注意线程安全和同步的问题,避免出现竞态条件和数据一致性问题。
5、多进程与多线程
需要注意的是,Python 的多线程在某些情况下由于 GIL 的存在,可能不会充分发挥多核处理器的性能优势,因此在一些情况下,多进程可以是更好的选择。但对于 I/O 密集型任务,多线程通常是一个有效的选择,因为线程可以在等待 I/O 操作完成时让出 CPU 资源。
总之,Python 提供了多进程和多线程的支持,允许你以不同的方式实现并发编程,以满足不同类型任务的需求。选择使用进程还是线程取决于你的具体应用场景和性能需求。
二、实现多线程的方式
1、编写一个类,继承 threading.Thread
类
你可以创建一个自定义的线程类,继承自 threading.Thread
类,并重写 run
方法来定义线程的执行逻辑。
import threading
class MyThread(threading.Thread):
def run(self):
for i in range(1000):
print("分支线程-->",i)
# 创建线程对象
my_thread = MyThread()
# 启动线程
my_thread.start()
for i in range(1000):
print("主线程-->", i)
2、使用 threading
模块
Python 内置了 threading
模块,它提供了创建和管理线程的类和方法。这是 Python 中最常用的多线程编程方式。
import threading
# 定义一个线程函数
def my_function():
for i in range(1000):
print("分支线程-->",i)
# 创建线程对象
my_thread = threading.Thread(target=my_function)
# 启动线程
my_thread.start()
for i in range(1000):
print("主线程-->", i)