之前用 redis 实现了一个锁,但是发现这个锁并不能正常工作,经常两个进程同时获得锁,但是我实在看不出哪一步出现问题了,求大家帮忙看看,或者教教我怎么调试,谢谢了。 代码:
def lock(self):
_lock_key = self._key['_lock:_**']
re = self._re
while True:
get_stored = re.get(_lock_key)
if get_stored:
time.sleep(0.01)
else:
if re.setnx(_lock_key, 1):
re.expire(_lock_key, 5)
return True
def unlock(self):
_lock_key = self._key['_lock:_**']
pipeline = self._re.pipeline
with pipeline() as p:
try:
p.watch(_lock_key)
p.multi()
p.delete(_lock_key)
p.execute()
except:
sys.stderr.write("not deleted\n")
测试方法:5个进程循环20次不断获取锁,sleep 0.01 秒,释放锁。
def test_mutex(name, thread_num):
for i in xrange(20):
mutex = Mutex(name, timeout=5)
mutex.lock()
sys.stderr.write("locked\n")
time.sleep(0.01)
mutex.unlock()
sys.stderr.write(thread_num + "---unlocked\n\n")
之前 unlock 是简单的 delete 掉 key,然后怀疑delete时已经超时,就改成上面的实现方式,结果还是不行。能帮忙分析下哪步有问题吗,谢了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.