c语⾔守护线程,并发编程~~~多线程~~~守护线程,互斥锁,死锁现象与递归锁,信号量(Se。。。
⼀ 守护线程
from threading import Thread
import time
def foo():
print(123)
time.sleep(1)
print('end123')
def bar():
print(456)
time.sleep(3)
print('end456')
t1 = Thread(target=foo)
t2 = Thread(target=bar)
t1.daemon = True
t1.start()
t2.start()
print('主线程')
# 123
# 456
# 主线程
# end123
# end456
守护线程 等待⾮守护⼦线程以及主线程结束之后,结束.
⼆ 互斥锁
from threading import Thread,Lock
x = 100
def task(lock):
lock.acquire()
global x
x -= 1
if __name__ == '__main__':
lock = Lock()
lst = []
for i in range(100):
t = Thread(target=task,args=(lock,))
lst.append(t)
t.start()
for i in lst:
编程递归函数i.join()
print(f'主线程{x}')
三 死锁现象与递归锁
1.死锁:
两个或两个以上的进程或线程在执⾏过程中,因为争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,它们都将⽆法推进下去.此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程
2.递归锁:
解决死锁的⽅法
from threading import Thread,RLock
lock_A = lock_B = RLock()
class MyThread(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
lock_A.acquire()
print(f'{self.name}拿到了A锁')
lock_B.acquire()
print(f'{self.name}拿到了B锁')
lease()
lease()
def f2(self):
lock_B.acquire()
print(f'{self.name}拿到了B锁')
lock_A.acquire()
print(f'{self.name}拿到了A锁')
lease()
lease()
if __name__ == '__main__':
for i in range(3):
t = MyThread()
t.start()
四 信号量 (Semaphore)
信号量也是⼀种锁,控制并发数量
from threading import Thread,Semaphore,current_thread
import time,random
sem = Semaphore(5)
def task():
sem.acquire()
print(f'{current_thread().name}厕所ing')
time.sleep(random.randint(1,3))
if __name__ == '__main__':
for i in range(20):
t = Thread(target=task,)
t.start()
五 GIL全局解释器锁
理论上来说: 单个进程的多线程可以利⽤多核
但是,开发开发CPython解释器的程序员给进⼊解释器的线程加了锁.同⼀时刻只能允许⼀个线程进⼊解释器
为什么加锁?
当时都是单核时代,⽽且CPU价格⾮常贵
如果不加全局解释器锁,开发CPython解释器的程序员就会在源码内部各种主动加锁,⾮常⿇烦,各种死锁现象等等.为了省事,进⼊解释器时直接给线程加⼀个锁
优点: 保证了CPython解释器的数据资源的安全.
缺点: 单个进程的多线程不能利⽤多核
Jython和pypy没有GIL锁
单个进程的多线程可以并发,但不能利⽤多核,不能并⾏
遇到IO阻塞,CPU就会被操作系统切⾛,GIL锁被释放,线程挂起,另⼀个线程进⼊,可以实现并发
多个进程可以并发,并⾏
IO密集型: 单个进程的多线程适合并发执⾏.
计算密集型: 多进程的并⾏
六 GIL与lock锁的区别
相同点: 都是同种锁,互斥锁
不同点:
G IL锁保护解释器内部的资源数据的安全. GIL锁上锁,释放⽆需⼿动操作.
⾃定义的互斥锁保护进程中的资源数据的安全, 必须⾃⼰⼿动上锁,释放锁
python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)
9.94 守护线程与守护进程的区别 1.对主进程来说,运⾏完毕指的是主进程代码运⾏完毕2.对主线程来说,运⾏完毕指的是主线程所在的进程内所有⾮守护线程统统运⾏完毕,主线程才算运⾏完毕详细解释:1.主 ...
python 并发编程 多线程 守护线程
做完⼯作这个进程就应该被销毁 单线程情况: ⼀个进程 ,默认有⼀个主线程 ,这个主线程执⾏完代码后 ,就应该⾃动销毁.然后进程也销毁. 多线程情况: 主线程代表进程结束 ⼀个进程可以开多个线程,默认开 ...
[py]GIL(全局解释器锁):多线程模式
在多线程 时同⼀时刻只允许⼀个线程来访问CPU,直到解释器遇到I/O操作或者操作次数达到⼀定数⽬时才会释放GIL 参考 Python虽然不能利⽤多线程实现多核任务,但可以通过多进程实现多核任务.多个P ...
python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有⽤-死锁-递归锁-信号量-Event事件-线程结合队列-03
⽬录 结合多线程实现服务端并发(不⽤socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有⽤需 ...
10 并发编程-(线程)-GIL全局解释器锁&;死锁与递归锁
⼀.GIL全局解释器锁 1.引⼦ 在Cpython解释器中,同⼀个进程下开启的多线程,同⼀时刻只能有⼀个线程执⾏,⽆法利⽤多核优势 ⾸先需要明确的⼀点是GIL并不是Python的特性,它是在实现Pyt ...
并发编程(五)——GIL全局解释器锁、死锁现象与递归锁、信号量、Event事件、线程queue
GIL.死锁现象与递归锁.信号量.Event事件.线程queue ⼀.GIL全局解释器锁 1.什么是全局解释器锁 GIL本质就是⼀把互斥锁,相当于执⾏权限,每个进程内都会存在⼀把GIL,同⼀进程内的多 ...
TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q
TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q ⼀.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地⽅使⽤ TCP服务 ...
python 并发编程 多线程 GIL全局解释器锁基本概念
⾸先需要明确的⼀点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引⼊的⼀个概念. 就好⽐C++是⼀套语⾔(语法)标准,但是可以⽤不同的编译器来编译成可执⾏代码. ...
⽹络编程之多线程——GIL全局解释器锁
⽹络编程之多线程--GIL全局解释器锁 ⼀.引⼦ 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...
随机推荐
腾讯QQ内测新功能:QQ万⼈即将袭来!
4⽉6⽇早晨有⼈爆出QQ正在内部测试QQ万⼈的消息,此消息⼀出,⽹友们都不蛋定了,各种议论纷纷,可是唯独腾讯没有做出任何有关这⽅⾯的解释. QQ是要准备让上万个⼈在⼀个聊天吗? 那不会被刷屏刷死 ...
8. js中json格式解析
var doc = O_PARAMETER.FJSonStr;(doc为:{"items":[],"nextId":0}) //1.先转为json对象,主要有以 ...
事务复制中的snapshot
Snapshot agent读取article的信息,将article的内容和脚本放置到snapshot⽂件夹中: 接下来distribution agent会读取这些快照⽂件,传输到订阅,完 ...
shell脚本检测局域⽹内存活主机
<1> d211 admin # for i in {3..254} ; do ping -c 1 192.168.1.$i &>/dev/null && e ...
jQuery 停⽌动画、jQuery Callback 函数、jQuery - Chaining
⼀.jQuery 停⽌动画 jQuery stop() ⽅法⽤于在动画或效果完成前对它们进⾏停⽌. stop() ⽅法适⽤于所有 jQuery 效果函数,包括滑动.淡⼊淡出和⾃定义动画. $(sele ...
Descending Order
Descending Order Description: Your task is to make a function that can take any non-negative integer ...
接⼝测试-jmeter
Maven&;&;Philosophy~
What is Maven? At first glance Maven can appear to be many things, but in a nutshell Maven is an att ...
jQuery-----隔⾏换⾊&sol;全选全不选/
隔⾏换⾊:              全选全不选:        分析:              1.页⾯加载  $(function(){})              2.获取所有奇数⾏数 ...