我什么时候获得一个块状态设置为False的锁?

时间:2018-01-05 07:44:14

标签: python locking multiprocessing

我想知道为什么设置compareFunction(direction: any, a: any, b: any) { let first = isNaN(Number(a)) ? a.toLowerCase() : Number(a); let second = isNaN(Number(b)) ? b.toLowerCase() : Number(b); if (first < second || (!isNaN(Number(a)) && isNaN(Number(b)))) { return -1 * direction; } if (first > second || (isNaN(Number(a)) && !isNaN(Number(b)))) { return direction; } return 0; } 会有意义?

block=false

如果我不需要阻止,我根本不会使用Lock?

3 个答案:

答案 0 :(得分:2)

来自Python in a Nutshell

  

L.acquire()
  什么时候   闭塞    是真的,获得锁   大号   。如果   大号    已被锁定,调用线程暂停并等待直到   大号    解锁了,   锁定   大号   。即使调用线程是最后锁定的线程   大号   ,它仍然暂停并等待直到另一个线程   发布   大号   。什么时候   闭塞    是假的   大号    解锁,获得锁定   大号    并返回True。什么时候   闭塞    是假的   大号    是   锁定,获取不影响   大号   ,并返回False。

使用以下简单代码的实际示例:

from multiprocessing import Process, Lock, current_process


def blocking_testing(lock):
    if not lock.acquire(False):
        print('{} Couldn\'t get lock'.format(current_process().ident))
    else:
        print('{} Got lock'.format(current_process().ident))


if __name__ == '__main__':
    lock = Lock()
    for i in range(3):
        procs = []
        p = Process(target=blocking_testing, args=(lock,))
        procs.append(p)
        p.start()
        for p in procs:
            p.join()

使用上述版本(blocking=False),此输出

  

12206得到了锁定   12207无法获得锁定   12208无法锁定

如果我设置blocking=True(或删除它,因为默认为True),主进程将挂起,因为Lock未被释放。 最后,如果我设置blocking=True并在结尾添加lock.release(),我的输出将是

  

12616得到了锁定   12617得到锁定
  12618锁定

我希望这是一个明确的解释。

答案 1 :(得分:1)

multiprocessing.Lock不用于阻止,它用于保护一个或多个资源免受并发访问。

最简单的示例可以是由多个进程编写的文件。为了保证一次只有一个进程在给定文件上写入,您可以用Lock保护它。

在某些情况下,您的逻辑无法阻止。例如,如果您的逻辑由asyncio模块之类的事件循环编排,则阻塞将停止整个执行,直到Lock被释放。

在这种情况下,常见的方法是尝试获取Lock。如果成功,则继续访问受保护资源,否则将转到其他例程并稍后尝试。

答案 2 :(得分:1)

这是参数的名称:blockblock=False提供非阻塞功能来访问受保护资源。

示例一:

您有一个GUI线程和一个后台工作线程。您的GUI线程需要修改工作线程生成的一些数据,但您的GUI线程无法阻止,因为它会阻止整个交互。因此,您可以使用lock.acquire(block=False)安全地检查数据是否已准备就绪而不会阻塞。

示例二:

与事件循环相关的另一个示例是asyncio,这提供了对受保护资源的非阻塞访问。