这里有比赛情况吗?如何处理?

2024-05-20 00:01:21 发布

您现在位置:Python中文网/ 问答频道 /正文

这段代码有竞态条件还是竞态条件只发生在协同程序中? 我如何解决这种竞争条件,最好不用库?在

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]

Tags: 代码inselfdefsubscriptionsopen条件class
1条回答
网友
1楼 · 发布于 2024-05-20 00:01:21

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

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

相关问题 更多 >