在线程中使用Django通道

时间:2018-11-01 08:40:09

标签: django python-multithreading django-channels

我正在使用Django通道,以便将多个响应发送到单个请求。代码是这样的:

class terminal(WebsocketConsumer):
   def connect(self):
       self.accept()

   def disconnect(self, close_code):
       self.close()

   def receive(self, text_data):
       data_json = json.loads(text_data)
       if data_json['event'] == 'initial':
          self.t = threading.Thread(target=self.send_data)
          self.t.daemon = True
          self.t.start()
       elif data_json['event'] == 'pause':
          pass
       print("done")

   def send_data(self):
       n = 100
       end = 1000000
       while (n + 1 < end)
          # some code
          self.send(json.dumps({'data':data})
          n += 1

我已使用线程在将数据发送到客户端时监听 暂停 和其他事件。 问题是在websocket断开连接后,线程继续运行。

是否可以在 disconnect 函数中杀死python线程?也许是实现此目的的更好方法?

1 个答案:

答案 0 :(得分:0)

可能有很多方法可以解决您的问题。我建议您使用sync_to_async()中的函数asgiref.sync。它创建一个新线程并“唤醒”,直到完成。 “唤醒”意味着在异步上下文中,其他代码可以同时运行。

要呼叫sync_to_async(),您必须使用AsyncWebsocketConsumer

class terminal(AsyncWebsocketConsumer):
   async def connect(self):
       awaitself.accept()

   async def disconnect(self, close_code):
       await self.close()

   async def receive(self, text_data):
       data_json = json.loads(text_data)
       if data_json['event'] == 'initial':
          await sync_to_async(self.send_data)()
       elif data_json['event'] == 'pause':
          pass
       print("done")

   def send_data(self):
       n = 100
       end = 1000000
       while (n + 1 < end)
          # some code
          sync_to_async(self.send)(json.dumps({'data':data})
          n += 1