【问题标题】:Python binary semaphore VS lockPython二进制信号量VS锁
【发布时间】:2014-03-07 02:27:39
【问题描述】:

我们在多线程 python 环境中工作,需要对如下代码进行互斥:

lock = threading.Lock()
with lock:
    # get data from shared storage
    # process
    # put back to shared storage

目前在我看来二进制信号量threading.Semaphore() 和锁定threading.Lock() 将同样为此服务。如果我从锁定信号量切换到二进制信号量或反之,会有一些陷阱或收获吗?

注意:在 greenthreads 中运行的代码(如果情况发生变化)

【问题讨论】:

    标签: python multithreading python-2.7 concurrency locking


    【解决方案1】:

    threading.Semaphore() 在内部使用threading.Lock() 对象作为监视器。当Semaphore.acquire() 被调用时,信号量对象在其Lock 对象上调用acquire,递减它的值,然后释放锁。

    由此可知,二进制信号量实际上只是一个锁的包装器。我想不出两者在功能上有什么区别,除了使用 Semaphore 你可以传递可选的verbose = True 参数用于调试目的,并且可以选择使用blocking = False 调用acquire。

    【讨论】:

    • 谢谢! BTW Lock 也有 lock.acquire(blocking=False) 选项
    【解决方案2】:

    可以说,Semaphore 是 Lock 的高级版本。 Semaphore 有一个自定义的数字来控制多个线程访问资源。但是只有一个带锁的。

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 2013-07-15
      • 2022-11-05
      • 2020-12-23
      • 2012-10-07
      • 1970-01-01
      • 2017-10-03
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多