【问题标题】:What are the python equivalent of sem_init, sem_post, sem_wait provided by semaphore.h?semaphore.h 提供的 sem_init、sem_post、sem_wait 的 python 等价物是什么?
【发布时间】:2016-01-11 19:00:27
【问题描述】:

我正在尝试在我拥有的一段 python 代码中锁定多个变量,每个变量一个锁。可以使用 semaphore.h 中提供的 sem_wait、sem_post、sem_init 例程在 C 中轻松锁定变量。 python中的等价物是什么?

附录:

目前使用的代码结构相当于

lock1 = threading.lock()
lock2 = threading.lock()

Thread 1
lock1.acquire()
var1 = func1()
lock1.release()
lock2.acquire()
var2 = func2()
lock2.release()

Thread 2
lock1.acquire()
var1 = func1()
lock1.release()
lock2.acquire()
var2 = func2()
lock2.release()

【问题讨论】:

    标签: python semaphore


    【解决方案1】:

    查看标准库中的“线程”模块。它提供信号量、锁和其他并行处理细节。 https://docs.python.org/3.4/library/threading.html

    【讨论】:

      【解决方案2】:

      在大多数 python 实现中,您都有一个全局解释器锁,它可以一次阻止多个线程执行 python 代码。

      此外,在大多数实现中,GIL 仅在执行了一定数量的完整 python 字节码操作后才被释放,这意味着,与 C 不同,您不会遇到加载-增量-存储操作可以并行运行的情况,并且做错了——一般来说,对变量的改变是原子的。

      因此您通常不需要保护每个变量,并且您会发现很多代码实际上“正常工作”,具体取决于您使用 python 线程的方式。

      话虽如此,如果您需要比 GIL 隐式提供的更严格的控制,线程模块(尤其是条件变量)是您的最佳选择。

      【讨论】:

        猜你喜欢
        • 2020-07-15
        • 2011-09-03
        • 2011-03-07
        • 2013-10-18
        • 2019-04-02
        • 2012-03-20
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多