我有一个扩展WebsocketConsumer的类,因此可以通过websocket与客户端进行通信。根据我的理解,整个过程是事件驱动的,并且我有一个方法具有关键部分(我不想让仍在处理的函数再次触发)。
我可以只使用python的内置threading
模块来锁定此部分。例如:
import threading
class UserCharacterConsumer(WebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, *kwargs)
self.lock = threading.Lock()
def critical_method(self):
self.lock.acquire()
try:
# critical section
pass
finally:
self.lock.release()
或者这不适用于Django-Channels,因为它不以这种方式使用线程吗?
编辑:仅对当前用户(甚至仅对类实例)锁定方法就足够了
答案 0 :(得分:1)
这可能在开发中有效,但会在生产中中断,因为那里通常有多个进程,甚至可能有多个机器(或VM /容器)。
您必须使用一些共享的外部数据存储。您可以为此使用数据库,但是最好使用Redis之类的东西(例如使用Redlock)。
值得一提的是,这样的锁是一个瓶颈,它将限制应用程序的可伸缩性。我会检查您是否可以按用户锁定而不是全局锁定。