并发编程
2021/6/21 17:30:17
本文主要是介绍并发编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
操作系统/应用程序
a硬件
b系统
c软件
1线程和进程区别
1.1线程
线程是操作系统进行运算调度的最小单位
1.2进程
进程是指在系统中正在运行的一个应用程序,系统进行资源分配和调度的基本单位
1.3进程和线程的区别
第一点:
线程是cpu计算的最小单位
进程是cpu资源分配和调度的基本单位
第二点:
一个线程只能属于一个进程
一个进程可以有多个线程,至少有一个主线程
同一进程的所有线程可以共享该进程的所有资源
第三点:
对于python而言,他的进程和线程跟其他语言是有所差异的,一个进程可以同时执行多个线程
因为python存在GIL锁,一个进程在同一时刻只有一个线程被执行
注意:
IO密集型操作可以使用多线程,计算密集型可以使用多进程
每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,
所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。
2线程
2.1基本写法
import threading
def func(args):
for i in range(args):
print(i)
for i in range(10):
t=threading.Thread(target=func,args=(10,))
t.start
主线程等待子线程
join
主线程不等待子线程
setDaemon
2.2GIL锁
gil锁用于限制一个进程中同一时刻只有一个线程被cpu调度
默认gil锁在执行100个cpu指令
基本写法
import threading
lock = threading.Rlock()
def task(args):
lock.acquire() ###加锁
for i in range(args):
print(i)
lock.release() ###释放锁
for i in range(10):
t=threading.Thread(target=task,args=(i,))
t.start
2.3GIL锁类型
线程安全,多线操作时,内部会让所有线程排队处理
1Lock,锁一个代码块
2RLock(一次放一个) ###常用
3BoundedSemaphore(一次放n个)信号量
4Condition(一次放x个数)
5Event(一次放所有)
6threading.local(flask框架内部看到源码,上下文管理)
作用:内部自动为每个线程维护一个空间(字典),
用于当前存取属于自己的值,保证线程之间数据隔离
线程安全,列表和字典线程安全:
加锁:非线程安全、控制一段代码
threading.local(flask框架内部看到源码,上下文管理)
7线程池
from concurrent.future import ThreadPoolExecutor
pool = ThreadPoolExecutor()
def task(a1,a2):
print(a1,a2)
for i in range(10):
pool.submit(task,i,i*i)
8生产者消费模型 queue
生产者
队列,先进先出
栈,后进先出
消费者
生产者消费者模型结了什么问题?
生产者消费模型,不用一直等待
import queue
q = queue.Queue()
q.put()
v1 = q.get()
print(v1)
这篇关于并发编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南