我想知道为什么设置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?
答案 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)
这是参数的名称:block
。 block=False
提供非阻塞功能来访问受保护资源。
示例一:
您有一个GUI线程和一个后台工作线程。您的GUI线程需要修改工作线程生成的一些数据,但您的GUI线程无法阻止,因为它会阻止整个交互。因此,您可以使用lock.acquire(block=False)
安全地检查数据是否已准备就绪而不会阻塞。
示例二:
与事件循环相关的另一个示例是asyncio
,这提供了对受保护资源的非阻塞访问。