我正在使用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线程?也许是实现此目的的更好方法?
答案 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