У меня есть служба django (скажем, 'brisbane'
), которая отправляет обновления в браузеры клиентов, когда модели баз данных сохраняются с использованием каналов и сигналов, таким образом:
def invalidated_serialized_model_receiver(self, sender, **kwargs):
...
async_to_sync(get_channel_layer().group_send)(name, update)
Это работает и дает хорошие обновления в реальном времени.
'brisbane'
теперь необходимо взаимодействовать с другим сервисом (тот же код) 'sydney'
, чтобы его можно было аналогичным образом обновлять в режиме реального времени в отношении изменений в sydney's
данных.При этом используется потребитель, работающий в другом процессе, который выглядит примерно так:
async def remote_site_consume(site):
socket_url = site.urn(protocol='ws', resource_name='/ws/watch/')
async with websockets.connect(socket_url) as websocket:
await websocket.send(json.dumps({'type': 'watch_messages'}))
...
async for event in websocket:
event = json.loads(event)
await get_event_handler(event)(site, websocket, event)
Сигнал может быть отправлен законным образом из обработчика событий, в котором и возникает проблема.Когда это происходит, выдается RuntimeError
'Вы не можете использовать AsyncToSync в том же потоке, что и цикл асинхронных событий - просто ждите асинхронную функцию напрямую.'
Iне могу просто использовать await, потому что сигнал также посылается из потоков без цикла обработки событий.