【问题标题】:how make django sleep如何让 django 睡觉
【发布时间】:2021-10-11 20:35:09
【问题描述】:

我有一个项目,其中一个客户注册一个请求,而其他一些客户必须回答是否要与他实时合作,问题是我如何让他的消费者睡到等到其中一个公认 如果我使用 time.sleep() 整个项目将休眠

class ConsulationConsumer(WebsocketConsumer):

    def connet(self):
        pass 

    def diconnect(self,code_close):
        pass 

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        consultation = text_data_json['message']
        consulator=ConsultationOrder.objects.get(id=consultation).lawyer

        if(consulator==None):
            consulator=0        
        self.send(text_data=json.dumps({
            'message': consulator
        }))

【问题讨论】:

  • 为什么不使用AsyncWebsocketConsumer
  • 您正在查看某种通知机制而不是睡眠。您可以使用 RabbitMQ 之类的队列,并让客户端在队列上发布消息(如果它想要工作)。不将此添加为答案,因为它不是问题的直接答案,而是解决问题的更好方法
  • 坦率地说,我不认为你的方法是最好的。为什么你需要使用 sleep 来等待某人接受。您可以让连接保持打开状态,然后在有人接受后通过 websocket 向用户发送消息。以下文档可能对 channels.readthedocs.io/en/latest/topics/… 有所帮助您可以使用 channel_layer.send 并传递该用户的频道名称向正在等待答案的用户发送消息
  • 问题是我想轮流问人,每个人只有1分钟接受或忽略一分钟后他不能接受,下一个必须选择这就是为什么我想使用sleep 更改候选者。
  • 非常感谢 @shoaib30 的出色指导,我使用 celery 解决问题,效果非常好

标签: python django django-channels channels


【解决方案1】:

我用 Celery 解决了这个问题 我用 apply_async 和 countdown 来解决这个问题

我创建了一个 celery 任务并在 for 循环中使用了 apply_async 和倒计时

for idx,lawyer in enumerate(lawyers):
    if(consultation.lawyer):
        break      
    change_offered_lawyer.apply_async((id,lawyer.id),countdown=idx*60)

这样每次根据 idx 的计数,视图都会等待然后调用任务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2011-10-19
    相关资源
    最近更新 更多