当我运行Django通道的工作线程作为后台任务时,有时会遇到一个错误。该任务使用一个开放的第三方WebSocket和一个名为Pysher的库,处理这些数据,然后通过通道层将结果数据发送到一组使用Redis(消息代理)监听我们的应用程序的WebSocket。在
我知道这个问题与Pysher库无关,因为如果我对通过通道层发送消息的代码进行注释,则不会出现问题。这个问题是因为在通道层发送消息,只是有时候会发生,很多时候发送成功,有时候会抛出错误,最后一个行为让我觉得可能跟Redis或者通道层及其配置或者类似的事情有关,也许Redis已经到了极限。在
错误消息
error from callback bound method Connection._on_message of Connection(Thread-2, started daemon 140614612023040):
[Errno 99] Cannot assign requested address
SO和Redis版本:Ubuntu 16+Redis 3.2
Pip依赖项
^{pr2}$信道层配置
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("localhost", 6379)]
},
},
}
我的代码
# Synconsumer Class that runs as Channels Worker Background task
class BTWorker(SyncConsumer):
# Class method
def get_data(self, event):
# Callback function that runs every time We receive a message from the thrid party Websocket
def callback(*args, **kwargs):
# Data processing
raw_dict = json.loads(args[0])
var_dict = {
'id': raw_dict['id'],
'other_key': other_value
}
var_list = [var_dict]
# Send data via Channel Layer and Redis (CODE that generate the ISSUE!!)
async_to_sync(self.channel_layer.group_send)(
"group_name",
{
"type": "some.type",
"text": json.dumps(trade_uni_list)
}
)
# Websocket Third party connection handler
def connect_handler(data):
channel = pusher.subscribe('token')
channel.bind('channel', callback)
# Websocket Third Party connection via Pysher Library
pusher = pysher.Pusher('******some_key****')
pusher.connection.bind('pusher:connection_established', connect_handler)
pusher.connect()
我知道这听起来很荒谬,考虑到它有时会起作用,但是你能把'localhost'切换到'127.0.0.1'并看看它是否可以修复吗?我发现某些python模块可能会被localhost混淆。。。即使它断断续续地工作。在
相关问题 更多 >
编程相关推荐