django channles channel.exceptions.Channels Full - PullRequest
0 голосов
/ 27 октября 2018

Я довольно новичок в django-channel и python, я делаю демонстрацию, используя django-channel и django для активной отправки данных из бэкэнда на фронт.код в consumer.py, как показано ниже:

websocket_clients = []

class WebsocketConsumer(AsyncWebsocketConsumer):       
    def __init__(self, *args, **kwargs):
    """
    initial a new thread when new websocket instance initialed.
    """
    super(WebsocketConsumer, self).__init__(self)
    self.index_websocket = GendataThread()


    async def connect(self):
        self.index_websocket.channels_name = self.channel_name
        print('channel_name', self.channel_name)
        self.index_websocket.start()
        websocket_clients.append(self.channel_name)
        await self.accept()


    async def disconnect(self, close_code):
        """disconnected a websocket instance, and stop the thread."""

        self.index_websocket.stop()
        time.sleep(2)
        index = websocket_clients.index(self.channel_name)
        websocket_clients.pop(index)


    async def receive(self, text_data):
        """receive message from connected client, wouldn't work in this project."""
        text_data = '{"message": "%s"}' % (text_data)
        text_data_json = json.loads(text_data)


    async def chat_message(self, event):
    """send message to websocket."""
        print('event', event)
        await self.send(text_data=json.dumps(
        {'message': event['message']}))


def websocket_send_data(data, channel_name):
    """
    send data to front in websocket protocol,
    :param data: data which will be sent,
    :param channel_name: a symbol to mark connected client.
    :return:
    """
    channel_layer = get_channel_layer()
    event = {
        "type": "chat.message",
        "message": data
    }
    async_to_sync(channel_layer.send)(channel_name, event)

, как вы можете видеть, я создаю имя функции: websocket_send_data (data, channel_name), которую я могу вызвать в GendataThread (), как показано ниже:

class GendataThread(threading.Thread):
    """new thread
    thread for getting data from cluster, and send to front with websocket protocol.
    """
    def __init__(self, *args, **kwargs):
        super(GendataThread, self).__init__(*args, **kwargs)
        self.channels_name = None

    def run(self):
        while true:
          websocker_send_data('1', self.channels_name)

в этом случае я могу отправлять данные из бэкэнда на фронт во время работы проекта django, я подключаюсь к URL

ws://127.0.0.1:8000/ws/intime_data

, который установлен в routing.py, как показано ниже:

websocket_urlpatterns = [
    url(r'^ws/intime_data$', consumers.WebsocketConsumer),
] 

Я могу получать данные спереди, но, поскольку он работает несколько минут, все идет не так:

aioredis.errors.ReplyError: OOM command not allowed when used memory > 'maxmemory'.

Я думаю, это потому, что redis переполнен сохранением данных, но я неМне не нужны эти данные, я пытаюсь настроить redis.conf:

maxmemory-policy allkeys-lru 

, но при использовании maxmemory все равно возникает ошибка.и иногда появляется такая ошибка:

channels.exceptions.Channels Full

Я думаю, что каналы используют redis в качестве кэша, но я не знаю, почему появляются ошибки, кто-нибудь может мне помочь?заранее спасибо.

...