mirror of
https://github.com/django/daphne.git
synced 2025-10-23 20:14:26 +03:00
37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
import time
|
|
import json
|
|
from collections import deque
|
|
from .base import BaseChannelBackend
|
|
|
|
queues = {}
|
|
|
|
class InMemoryChannelBackend(BaseChannelBackend):
|
|
"""
|
|
In-memory channel implementation. Intended only for use with threading,
|
|
in low-throughput development environments.
|
|
"""
|
|
|
|
local_only = True
|
|
|
|
def send(self, channel, message):
|
|
# Try JSON encoding it to make sure it would, but store the native version
|
|
json.dumps(message)
|
|
# Add to the deque, making it if needs be
|
|
queues.setdefault(channel, deque()).append(message)
|
|
|
|
def receive_many(self, channels):
|
|
if not channels:
|
|
raise ValueError("Cannot receive on empty channel list!")
|
|
while True:
|
|
# Try to pop a message from each channel
|
|
for channel in channels:
|
|
try:
|
|
# This doesn't clean up empty channels - OK for testing.
|
|
# For later versions, have cleanup w/lock.
|
|
return channel, queues[channel].popleft()
|
|
except (IndexError, KeyError):
|
|
pass
|
|
# If all empty, sleep for a little bit
|
|
time.sleep(0.01)
|
|
|