线、进程使用
什么是线程?什么是进程?二者有什么区别?
进程:是资源分配最小的单位
线程:是进程的一部分,也是cpu调试的最小单元,线程共享进程的资源,多个线程可以共享同一地址空间和其他资源,比如共享全局变量。
线程,是运行在进程当中的
锁
锁机制
保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
可以理解为内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功。如果已经上锁,则返回失败。解锁时,则把锁状态修改为空闲状态。
死锁的概念
两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象
永远在互相等待的进程称为死锁进程。死锁的原因包括系统资源不足、进程运行推进顺序不合适、资源分配不当等。
比如两只羊过独木桥。进程比作羊,资源比作桥。若两只羊互不相让,争着过桥,就产生死锁。
互斥锁
lock = threading.Lock()
上锁lock.acquire()
释放锁lock.release
死锁的必要条件
四个必要条件:
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件: 进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。存在一个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一资源,……,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。
线程
from threading import Thread
def fun(number):
return number ** number
# 新建、启动、等待结束
t=Thread(target=func, args=(100, ))
t.start()
t.join()
线程
from threading import Thread
def task(msg):
print(msg)
for i in range(6):
Thread(target=task, args=(i,)).start
线程池使用
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(10)
def task(msg):
print(msg)
for i in range(107):
pool.submit(task, i)
线程锁
lock.acquire()
Thread(target=task, args=(i,)).start()
lock.release()