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)

Django-channels:AttributeError:'str'对象没有属性'profile'

Angular Material 2 - 如何将 mat-toolbar 和 mat-tabs 锁定到顶部