python 学习笔记(多线程和多进程)

进程和线程的概念

进程和线程的区别:

简单的说:进程就是运行着的程序

系统中每个进程里面至少包含一个线程。

线程是操作系统创建的,每个线程对应一个代码执行的数据结构,保存了代码执行过程中的重要的状态信息。

没有线程,操作系统没法管理和维护代码运行的状态信息。所以没有创建线程之前,操作系统是不会执行我们的代码的。

要让多个CPU核心同时区执行任务,我们程序必须创建多个线程,让CPU执行多个线程对应的代码。
*

Python 代码中创建新线程

应用程序必须通过操作系统提供的系统调用,请求操作系统分配一个新的线程。

python3将系统调用创建线程的功能封装在标准库threading中。

python 复制代码

from threading import Thread

from time import sleep

print('主线程执行代码~')

def threadFunc(arg1,arg2):

print('子线程开始')

print(f'线程函数参数是:{arg1},{arg2}')

sleep(5)

print('子线程 结束')

thread = Thread(

target = threadFunc(),

args = ('参数1','参数2')

)

#执行start方法,就会创建新线程

thread.start()

#主线程的代码执行 子线程对象的join方法,

#就会等待子线程结束,才继续执行下面的代码

thread.join()

print('主线程结束')

复制代码
join 通常用于 主线程把任务分配给几个子线程,等待子线程完成工作后,需要对他们任务处理结束进行再处理。

这种情况,主线程 必须子线程完成才能进行后续操作,所以join就是等待参数对应的线程完成,才返回。

- ##### 共享数据的访问控制

做多线程开发,经常遇到这样的情况:多个线程里面的代码 需要访问 同一个 公共的数据对象。

这个公共的数据对象可以是任何类型,比如一个列表,字典,或者自定义类的对象。

有的时候,程序 需要防止线程的代码 同时操作公共数据对象。否则,就有可能导致 数据的访问互相冲突影响。



Lock对象的acquire方法是申请锁。

每个线程在操作共享数据对象之前,都应该申请获取操作权,也就是调用该共享数据对象对应的**锁对象的acquire方法。**

如果线程A执行如下代码,调用acquire方法的时候,

```python
bankLock.acquire()

别的线程B已经申请到了这个锁,并且还没有释放,那么线程A的代码就在此处等待线程B释放锁,不去执行后面的代码。

直到线程B执行了锁的release方法释放了这个锁,线程A才可以获取这个锁,就可以执行下面的代码了。

如果这时线程B又执行这个锁的acquire方法,就需要等待线程A执行该锁对象的release方法释放锁,否则也会等待,不去执行后面的代码。

daemon线程
python 复制代码

from threading import Thread

from time import sleep

def threadFunc():

sleep(2)

print('子线程 结束')

thread = Thread(target=threadFunc())

thread.start()

print('主线程结束')

复制代码
**注意:**Python程序中当所有的非daemon线程结束了,整个程序才会结束。

主线程是非daemon线程,启动的子线程缺省也是非daemon线程。所以,要等到主线程和子线程都结束,程序才会结束。

```python
from threading import Thread
from time import sleep

def threadFunc():
    sleep(2)
    print('子线程 结束')

thread = Thread(target=threadFunc(),daemon=True)
thread.start()
print('主线程结束')

再次运行,可以发现,只要主线程结束了,整个程序就结束了。因为只有主线程是非daemon线程

多进程

Python 官方解释器的每个线程要获得执行权限,必须获取一个叫GIL(全局解释器)的东西

这就导致了Python的多个线程 其实 并不能同时使用多个CPU核心。

所以如果是计算密集型的任务,不能采用多线程的方式。

相关推荐
啊阿狸不会拉杆1 分钟前
《机器学习导论》第 7 章-聚类
数据结构·人工智能·python·算法·机器学习·数据挖掘·聚类
摇滚侠1 分钟前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python
禹凕6 分钟前
Python编程——进阶知识(面向对象编程OOP)
开发语言·python
匆匆那年96714 分钟前
llamafactory推理消除模型的随机性
linux·服务器·学习·ubuntu
一晌小贪欢16 分钟前
深入理解 Python HTTP 请求:从基础到高级实战指南
开发语言·网络·python·网络协议·http
七牛云行业应用16 分钟前
1M上下文腐烂?实测Opus 4.6 vs GPT-5.3及MoA降本架构源码
人工智能·python·llm·架构设计·gpt-5·claude-opus
好好学习天天向上~~18 分钟前
5_Linux学习总结_vim
linux·学习·vim
笨笨阿库娅19 分钟前
从零开始的算法基础学习
学习·算法
Java后端的Ai之路5 小时前
【Python 教程15】-Python和Web
python
冬奇Lab7 小时前
一天一个开源项目(第15篇):MapToPoster - 用代码将城市地图转换为精美的海报设计
python·开源