当前位置: > python教程 > python多线程 >

python并发编程11--lock与Rlock区别
栏目分类:python多线程   发布日期:2019年03月11日 14:00:22   浏览次数:

        在并发编程的前两篇文章中分别介绍了Lock与Rlock锁,接下来我将介绍这两种锁的细微区别,使大家对锁有更深的认识。

                                               python并发
1.区别
lock锁的操作是跨线程的,Rlock的操作不能跨线程操作。即lock的操作任何线程都有权限,Rlock的锁只能由获得该锁的该线程来操作。其实lock锁锁住的是共享资源的访问,并不会造成其他线程对非共享资源的访问造成任何影响。下面给出实例代码,可以看出这种细微区别:

import threading
import time
lock = threading.Lock()

def task1():
    lock.acquire()
    time.sleep(1)
    while True:
        if not lock.locked():
            break
    print('我被解锁了哦,task1 done')

def task2():
    time.sleep(1)
    lock.release()
    print('task2 done')

tasks = [threading.Thread(target=task1), threading.Thread(target=task2)]
for t in tasks:
    t.start()
print('main done')
结果如下:
'''
main done
task2 done
我被解锁了哦,task1 done
'''

2.分析
    可以看到task1函数并如果没有外力的作用下,线程会不断运行不会终止。task2线程函数对锁进行了释放的操作。最终两个线程函数都得以结束。可以看到:
1).lock锁的操作支持跨线程的
2).lock锁真正锁住的是共享资源的访问

3.Rlock
修改部分代码:

lock = threading.RLock()

def task1():
    lock.acquire()
    time.sleep(1)
    while True:
        pass
    print('我被解锁了哦,task1 done')
这时结果如下:
'''
main done
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/home/mylinux/pyspace/other/并发/lockrlock.py", line 14, in task2
    lock.release()
RuntimeError: cannot release un-acquired lock
'''
线程Thead-2抛出RuntimeError而终止运行,可以看出Rlock是不能跨线程操作锁的。

结语

    相同点:lock和Rlock锁在没有获取锁对象调用release方法都会抛出RuntimeError异常
    不同点:lock操作是支持跨线程的,Rlock只限获得锁的线程自己操作。Rlock锁是可以多次acquire也不会阻塞的,是一种递归锁。



相关热词:

热门关键词
python字符串
     
python教程 python爬虫 python人工智能 Python+大数据 python问答