这段代码有竞态条件还是竞态条件只发生在协同程序中? 我如何解决这种竞争条件,最好不用库?在
class Handler(WebSocketHandler):
listeners = {}
def open(self, sub):
self.subscriptions = [sub]
Handler.listeners.setdefault(sub, set()).add(self)
def on_close(self):
for sub in self.subscriptions:
Handler.listeners[sub].remove(self)
if not Handler.listeners[sub]:
# here in between someone might subscribe
# so we delete non empty set! which is wrong
del Handler.listeners[sub]
无竞争条件;Tornado应用程序通常是单线程的。除非您自己显式启动了任何线程,否则只有主线程在应用程序中运行。因此,在检查
not Handler.listeners[sub]
和执行del
之间不能中断代码。在即使你使用协同程序,像你这样的代码仍然没有种族。协同程序不能被中断,除非它执行
yield
语句。这是协同旅行的最佳特性之一。Consider this long and excellent post by Twisted's author中,他认为显式异步编程(使用回调或yield
语句)优于多线程,因为在异步编程中,竞争条件更容易发现。在相关问题 更多 >
编程相关推荐