并发编程

操作系统/应用程序
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)

 

上一篇:go常用命令


下一篇:sv7.5semphore