为了实现 Lock.
协程间通信很偶尔的情况会用到 Lock, Semaphore 和 Condition. 虽然很偶尔,但缺少这些同步机制的协程库都是不完整的。
其实 Lock 就是 jquery 的 Deferred,或者说 Promise,现在你也经常在用的吧。但协程库不能直接用 Deferred/Promise,因为协程 release 一个 Lock 之后,一般要等回事件循环以后才能跳到另外一个协程。所以要特别地提供一个 Lock. Lock 和 Semaphore 的实现方法一样,所以先实现一个 Semaphore.
Event 就是带值的 Lock, 如果无锁定,wait() 就直接返回值。否则加锁等待。set() 设置值并释放锁。上面那个帖子的实现其实不太对,github 上面的是针对协程的实现比较难懂。我这里换个写法给你看你就明白了:
class Event {
constructor() {
this.value = undefined;
this.deferred = new Deferred();
}
async wait() {
if (this.deferred) {
return await this.deferred.promise();
} else {
return this.value;
}
}
set(value) {
this.deferred = null;
this.value = value;
}
clear() {
this.deferred = new Deferred();
}
}
很简单对吧,也可以理解成只有一个槽的队列。大约再三十行代码就扩展成真正的 Queue 了。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 别的先不说, 引入Semaphore, 是为了解决啥问题?
--
FROM 112.47.122.*