Как объединить async-функции и обратные вызовы в python?
Если у меня есть асинхронное представление в Django, могу ли я сделать так, чтобы оно ожидало обратного вызова?
Псевдокод:
async def my_view(request):
# Use external services that eventually send data to /callback/
do_something()
# Wait for the callback
result = await callback_executed()
do_something_else(result)
# view for /callback/
def callback(request, result):
# Here control should be returned to my_view providing the result data
Я хотел бы избежать необходимости реализовывать вторую часть my_view
внутри callback
, а иметь async-функцию, которая возвращает результат в исходное представление, как только будет выполнен обратный вызов.
Я решил эту проблему с помощью redis.
Представление my_view
опрашивает очередь redis pubsub:
def my_view(request)
pubsub = redis.pubsub()
await pubsub.subscribe("some_channel")
# Use external services that eventually send data to /callback/
do_something()
# Wait for the callback
for _ in range(30):
message = await pubsub.get_message(ignore_subscribe_messages=True)
if message:
result = message["data"]
do_something_else(result)
break
await asyncio.sleep(1.0)
А представление callback
публикуется в очереди:
def callback(request, result):
redis.publish("some_channel", result)