这里是否存在竞争条件以及如何处理?

时间:2014-05-20 15:55:17

标签: python tornado

此代码是否具有竞争条件或竞争条件是否仅在协同程序中发生? 如何解决这种竞争条件,最好不使用库?

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]

1 个答案:

答案 0 :(得分:3)

没有竞争条件; Tornado应用程序通常是单线程的。除非您自己明确启动任何线程,否则只有主线程在您的应用程序中运行。因此,在检查not Handler.listeners[sub]和执行del之间不能中断您的代码。

即使您使用了协同程序,像您这样的代码仍然没有竞争对手。协程不能被中断,除非它执行yield语句。它是协同程序的最佳功能之一。 Consider this long and excellent post by Twisted's author他认为明确的异步编程(使用回调或yield语句)优于多线程,因为在异步编程中竞争条件更容易被发现。