最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

python多线程编程4:死锁和可重入锁

来源:动视网 责编:小采 时间:2020-11-27 14:28:27
文档

python多线程编程4:死锁和可重入锁

python多线程编程4:死锁和可重入锁:死锁在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:# encoding: UTF-8 import threading import time cl
推荐度:
导读python多线程编程4:死锁和可重入锁:死锁在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:# encoding: UTF-8 import threading import time cl


死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:

# encoding: UTF-8
import threading
import time
 
class MyThread(threading.Thread):
 def do1(self):
 global resA, resB
 if mutexA.acquire():
 msg = self.name+' got resA'
 print msg
 
 if mutexB.acquire(1):
 msg = self.name+' got resB'
 print msg
 mutexB.release()
 mutexA.release()
 def do2(self):
 global resA, resB
 if mutexB.acquire():
 msg = self.name+' got resB'
 print msg
 
 if mutexA.acquire(1):
 msg = self.name+' got resA'
 print msg
 mutexA.release()
 mutexB.release()
 
 
 def run(self):
 self.do1()
 self.do2()
resA = 0
resB = 0
 
mutexA = threading.Lock()
mutexB = threading.Lock()
 
def test():
 for i in range(5):
 t = MyThread()
 t.start()
if __name__ == '__main__':
 test()

执行结果:

Thread-1 got resA

Thread-1 got resB

Thread-1 got resB

Thread-1 got resA

Thread-2 got resA

Thread-2 got resB

Thread-2 got resB

Thread-2 got resA

Thread-3 got resA

Thread-3 got resB

Thread-3 got resB

Thread-3 got resA

Thread-5 got resA

Thread-5 got resB

Thread-5 got resB

Thread-4 got resA

此时进程已经死掉。

可重入锁

更简单的死锁情况是一个线程“迭代”请求同一个资源,直接就会造成死锁:

import threading
import time
 
class MyThread(threading.Thread):
 def run(self):
 global num
 time.sleep(1)
 
 if mutex.acquire(1): 
 num = num+1
 msg = self.name+' set num to '+str(num)
 print msg
 mutex.acquire()
 mutex.release()
 mutex.release()
num = 0
mutex = threading.Lock()
def test():
 for i in range(5):
 t = MyThread()
 t.start()
if __name__ == '__main__':
 test()

为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

import threading
import time
 
class MyThread(threading.Thread):
 def run(self):
 global num
 time.sleep(1)
 
 if mutex.acquire(1): 
 num = num+1
 msg = self.name+' set num to '+str(num)
 print msg
 mutex.acquire()
 mutex.release()
 mutex.release()
num = 0
mutex = threading.RLock()
def test():
 for i in range(5):
 t = MyThread()
 t.start()
if __name__ == '__main__':
 test()

执行结果:

Thread-1 set num to 1

Thread-3 set num to 2

Thread-2 set num to 3

Thread-5 set num to 4

Thread-4 set num to 5

文档

python多线程编程4:死锁和可重入锁

python多线程编程4:死锁和可重入锁:死锁在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:# encoding: UTF-8 import threading import time cl
推荐度:
标签: 编程 python 多线程
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top