网上的文章看了很多还是很迷茫,谁能通俗易懂的给我解释一下这两个概念啊?
我在python多线程编码中一般都是在线程的run方法中用while True死循环,然后在死循环的循环体末尾调用queue.task_done移除该队列,然后在主线程调用queue的join方法阻塞主线程,防止主线程直接结束,请问我这种多线程编码方式是否合理?会不会有什么bug?另外请问一下我在run中调用死循环是不是就叫做自旋锁?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
首先要了解什么是互斥锁,互斥锁代表的意思是什么,
就是在两个线程A,B 访问同一块内存的时侯。
理想情况下我们的执行顺序应该是 A 完全执行完后,B来执行
但是,执行是有占用CPU指令时间的,如果不用任何机制的话,当A执行到一半时,B占用了CPU,B去处理这段内存,然后B执行完毕,A再得到CPU,内存数据不就出错了吗?
为了内存的数据安全。就采用了一种互斥的技术,A访问这段内存的时候,首先判断这段内存有没有在使用中的标志(取个名字叫做锁),没有的话对这段内存加一个标志(锁),然后A在处理这段内存,A处理完了解锁。如果在A处理内存这个时候B来访问的话,B看到这段内存有使用中的标志(锁)了,B可以有好几种行为。行为一:占用CPU。不断循环并测试锁的状态,线程不会挂起(睡眠),处于忙等状态,采用这种行为的锁叫做自旋锁。行为二:线程B休眠阻塞,放弃CPU,直到A执行完了,锁没了,再使用内存。这种行为叫做互斥锁。看到这里你大概也明白了,锁就是实现互斥作用的同步机制。自旋锁就是互斥锁的一种情况(等待的时候会占用CPU的互斥锁)罢了。
不要被名称所误导。要了解背后的机制,换个名字也要明白,
参考链接 链接描述
Python代码会按照这样的流程进行运行,
设置GIL
切换到某一个线程
运行
线程退出,设置为休眠状态
解锁GIL
重复以上操作
可能是因为GIL的原因,我似乎没有在Python里面看到过自旋锁,更多使用的是互斥锁。
下面是我以前写多线程的方法,仅供参考~
既然是队列,Queue中Queue().get()中说明了Remove and return an item from the queue.