线程锁
线程中有两种锁
Lock
RLock
区别.
这两种琐的主要区别是:RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:
如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。
代码实例
Users in mainland China, if the Math option doesn't work for you, try if you can visit MathJax without VPN connected. If you can't, maybe it's blocked by the Great Firewall of China. Try connect to a VPN, climb over the wall, then the Math rendering should work.
# -*- coding:utf-8 -*-
""" Created by FizLin on 2017/07/24/-下午6:32
mail: https://github.com/Fiz1994
线程thread lock
使用例子
线程中有两种锁
这两种琐的主要区别是:RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:
如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。
"""
import threading
import time
import logging
import random
logging.basicConfig(level=logging.DEBUG,
format='(%(threadName)-9s) %(message)s', )
class Counter(object):
def __init__(self, start=0):
self.lock = threading.Lock()
self.value = start
def increment(self):
logging.debug('Waiting for a lock')
self.lock.acquire()
try:
logging.debug('Acquired a lock')
self.value = self.value + 1
finally:
logging.debug('Released a lock')
self.lock.release()
def worker(c):
for i in range(2):
r = random.random()
logging.debug('Sleeping %0.02f', r)
time.sleep(r)
c.increment()
logging.debug('Done')
if __name__ == '__main__':
counter = Counter()
for i in range(2):
t = threading.Thread(target=worker, args=(counter,))
t.start()
logging.debug('Waiting for worker threads')
main_thread = threading.currentThread()
for t in threading.enumerate():
if t is not main_thread:
t.join()
logging.debug('Counter: %d', counter.value)
"""
Rlock 的用处 多次使用锁, 例如递归,
这里使用的是 with statments
class X:
def __init__(self):
self.a = 1
self.b = 2
self.lock = threading.RLock()
def changeA(self):
with self.lock:
self.a = self.a + 1
def changeB(self):
with self.lock:
self.b = self.b + self.a
def changeAandB(self):
# you can use chanceA and changeB threadsave!
with self.lock:
self.changeA() # a usual lock would block in here
self.changeB()
"""
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。