Я пытаюсь использовать asyncio Python для одновременного запуска нескольких серверов, передавая данные между ними. Для моего конкретного случая мне нужен веб-сервер с веб-сокетами, UDP-подключение к внешнему устройству, а также база данных и другие взаимодействия. Я могу найти примеры практически любого из них по отдельности, но я изо всех сил пытаюсь найти правильный способ их одновременного запуска с передачей данных между ними.
Самое близкое, что я нашел здесь, находится здесь: Связь между асинхронным протоколом/серверами (хотя мне не удалось запустить его на Питоне 3.6)
Для более конкретного примера: как мне взять следующий пример кода aiohttp из https://github.com/aio-libs/aiohttp:
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
async def wshandler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == web.MsgType.text:
await ws.send_str("Hello, {}".format(msg.data))
elif msg.type == web.MsgType.binary:
await ws.send_bytes(msg.data)
elif msg.type == web.MsgType.close:
break
return ws
app = web.Application()
app.router.add_get('/echo', wshandler)
app.router.add_get('/', handle)
app.router.add_get('/{name}', handle)
web.run_app(app)
и следующий пример эхо-сервера TCP (http://asyncio.readthedocs.io/en/latest/tcp_echo.html):
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))
print("Send: %r" % message)
writer.write(data)
await writer.drain()
print("Close the client socket")
writer.close()
loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)
# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
и объединить их в один сценарий, в котором любые сообщения, полученные через веб-сокеты или эхо-сервер TCP, отправлялись всем клиентам любого из них?
И как мне добавить кусок кода, который (скажем) каждую секунду отправлял сообщение всем клиентам (ради аргумента текущую временную метку)?