Я пытаюсь протестировать Pub-sub Redis в настройке Sani c для нескольких рабочих, просто публикуя данные на канале, используя один маршрут Sani c (/setlevel
), и читая с другого маршрута (/api
).
Однако сообщение не может быть опубликовано на канале, за которым следует необъяснимое исключение (после тайм-аута?) Для вызова на /setlevel
.
import socket
import asyncio
from sanic import Sanic
from sanic.response import json as sjson
import aioredis
app = Sanic(__name__)
@app.route("/api")
async def route1(request):
print('Rcvd req in /api')
await tsk
return sjson('reached')
@app.route("/setlevel")
async def route2(request):
print('Rcvd req in /setlevel')
res = await pub.publish_json('chan1', ["Hello", "world"])
assert res == 1
return sjson('reached')
async def reader(ch):
while (await ch.wait_message()):
msg = await ch.get_json()
print("Got Message:", msg)
async def main(argv=sys.argv):
global pub, sub, tsk
pub = await aioredis.create_redis('redis://localhost')
sub = await aioredis.create_redis('redis://localhost')
res = await sub.subscribe('chan1')
ch1 = res[0]
tsk = asyncio.ensure_future(reader(ch1))
server_socket = '/tmp/sanictest.sock'
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(server_socket)
app.run(sock=sock, workers=4, debug=True)
print('Closing pub-sub...')
sub.close()
pub.close()
return
if __name__ == '__main__':
asyncio.run(main())
Что я здесь не так делаю?