并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。
并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时
执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序
对于时间片资源的争夺。
在多线程中利用互斥锁解决资源竞争
多线程共享全局变量
进程线程区别(把进程理解为流水线 线程就是流水线上的工人)
进程是资源分配的单位 线程是操作系统调度的单位 线程不能独立运行 需依附在进程中 线程资源开销小
但不利于资源的管理和保护 ,进程则相反
进程 线程 协程对比
通俗描述:
制造商品 为制造商品准备的生产线资源叫:进程
在生产线找工人生产 叫做:线程
为了提高生产率 三种方法:
1,在一条生产线多招工人 即是单进程 多线程
2,增加生产线 增加工人 即是多进程 多线程
3,为提高效率 一个线程 在等待某种条件 可以充分利用这个时间去做其他事情,这既是协程
总结:
进程是资源分配的单位
线程是操作系统调度的单位
进程切换需要的资源最大 效率很低
线程切换需要的资源一般 效率一般
协程切换任务资源很小效率高
多进程 多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
GIL 全局解释器所(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻
只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的
同时执行。
如何解决GIL锁的问题呢?
1.更换cpython为jpython(不建议)
2.使用多进程完成多线程的任务
3.在使用多线程可以使用c语言去实现
什么时候会释放Gil锁,
遇到像 i/o操作这种 会有时间空闲情况 造成cpu闲置的情况会释放Gil
会有一个专门ticks进行计数 一旦ticks数值达到100 这个时候释放Gil锁 线程之间开始竞争Gil锁(说明:
ticks这个数值可以进行设置来延长或者缩减获得Gil锁的线程使用cpu的时间)
互斥锁和Gil锁的关系
Gil锁 : 保证同一时刻只有一个线程能使用到cpu
互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱
import time
import threading
#定义一个全局变量
g_num = 100
def test1():
global g_num
#上锁,如果之前没有被上锁,那么此时上锁成功
#如果上锁之前已经上锁 那么此时会堵塞在这里 直到这个锁被解开
mutex.acquire()
for i in range(num):
g_num += 1
#解锁
mutex.release()
print("—in test1 g_num=%d—" % g_num)
def test2():
global g_num
mutex.acquire()
for i in range(num):
g_num += 1
#解锁
mutex.release()
print("—in test2 g_num=%d—" % g_num)
#创建互斥锁
mutex = threading.Lock()
def main():
t1 = threading.Thread(target=test1,args=(1000000,))
t2 = threading.Thread(target=test2,args=(1000000,))
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("—in main Thread g_num = %d—" %g_num)
if name == “main”:
main()
相关知识
解决多线程中资源竞争
多线程下解决资源竞争的7种方法
深度学习训练过程中的问题&解决
龟兔赛跑(基于GUI与多线程实现)
宠物行业常见营销问题,比如竞争激烈、成本高都如何解决啊?
猫咪救援中心的竞争优势
宠物医院行业竞争格局分析.docx
宠物培训行业竞争格局分析.docx
宠物殡葬竞争厂商概况怎么写
宠物培训学校行业竞争格局分析.docx
网址: 解决多线程中资源竞争 https://m.mcbbbk.com/newsview277577.html
上一篇: 猫咪也“压力大”,不减压可能会减 |
下一篇: 社会力沙龙第三期:动物资源消耗与 |