Django-Channels:在课堂上锁定关键部分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django-Channels:在课堂上锁定关键部分相关的知识,希望对你有一定的参考价值。
我有一个扩展WebsocketConsumer的类,因此通过websocket与客户端进行通信。根据我的理解,整个过程是事件驱动的,我有一个方法有一个关键部分(我不想在它仍然处理时再次触发该功能)。
我可以使用python内置的qazxsw poi模块来锁定此部分。例如:
threading
或者这不适用于Django-Channels,因为它不会以这种方式使用线程?
编辑:只为当前用户(甚至只是类实例)锁定方法就足够了
这可能在开发中起作用,但它会在生产中中断,因为您通常有多个进程,甚至可能有多个机器(或VM /容器)。
您必须使用一些共享的外部数据存储区。您可以使用您的数据库,但更喜欢Redis之类的东西(例如使用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:在课堂上锁定关键部分的主要内容,如果未能解决你的问题,请参考以下文章
在负载均衡器后面运行多个 daphne 实例:django-channels
使用 Apache2 和 Daphne 部署 django-channels
在真实服务器中部署 django-channels 的最佳方式
向 Django-channels WebSocket 发送授权凭证(不将令牌设置为 cookie)