我将如何组合两个异步库?
How would I combine two async libraries?
我将如何在同一个程序中组合两个 asyncio 库?
对于上下文,我希望将 Discord api 与 aiohttp 一起使用,它们都是异步事件循环驱动的。我可能也想添加一个异步 irc 库。
但是,我不明白它们将如何一起运行。我相信理论上我会实现该程序,使所有 class 个实例都使用相同的 asyncio 事件循环实例,然后将所有 运行 个函数组合成一个,最终调用事件循环。
但是,我想知道一般来说是否有更优雅的方法来做到这一点?
只要所有库都使用相同的事件循环,它们就能很好地协同工作。在这种情况下,您选择的所有库似乎都基于 asyncio(excetp gawel 的 IRC 库不再可用)。所以没有问题。有一个事件循环(没有线程),一切都很好。
您面临的问题是您将在同一个事件循环中有多个“服务器”,或者更准确地说,有多个协程处理来自外部世界的输入。一个协程处理 HTTP 流量,另一个处理 IRC“流量”。在伪代码中,可以翻译为:
import asyncio
async def irc_server():
async with irc_connect('irc.freenode.net#python-fr') as irc:
async for message in irc:
# do something useful with message
async def web_server():
async with web_connect('localhost:8080') as web:
async for request in web:
# do something useful with request
loop = asyncio.get_event_loop()
loop.create_task(irc_server())
loop.create_task(web_server())
loop.run_forever()
因此,两个协程无法通信。要使 HTTP 部分与 IRC 部分通信,您必须在两个协程之间共享一些内容。在生产中它很可能是某种数据库,但在伪代码中,它是一个简单的全局。你最终会得到这样的结果:
import asyncio
# value is shared between IRC and the web server.
value = None
async def irc_server():
global value
async with irc_connect('irc.freenode.net#python-fr') as irc:
async for message in irc:
# if message is echo, reply with the current value
# otherwise store the message as value
if message == 'echo':
irc.send(value)
else:
value = message
async def web_server():
global value
async with web_connect('localhost:8080') as web:
async for request in web:
if request.path == 'echo':
request.client.send(value)
else:
value = request.path # this is silly but simple
loop = asyncio.get_event_loop()
loop.create_task(irc_server())
loop.create_task(web_server())
loop.run_forever()
我将如何在同一个程序中组合两个 asyncio 库?
对于上下文,我希望将 Discord api 与 aiohttp 一起使用,它们都是异步事件循环驱动的。我可能也想添加一个异步 irc 库。
但是,我不明白它们将如何一起运行。我相信理论上我会实现该程序,使所有 class 个实例都使用相同的 asyncio 事件循环实例,然后将所有 运行 个函数组合成一个,最终调用事件循环。
但是,我想知道一般来说是否有更优雅的方法来做到这一点?
只要所有库都使用相同的事件循环,它们就能很好地协同工作。在这种情况下,您选择的所有库似乎都基于 asyncio(excetp gawel 的 IRC 库不再可用)。所以没有问题。有一个事件循环(没有线程),一切都很好。
您面临的问题是您将在同一个事件循环中有多个“服务器”,或者更准确地说,有多个协程处理来自外部世界的输入。一个协程处理 HTTP 流量,另一个处理 IRC“流量”。在伪代码中,可以翻译为:
import asyncio
async def irc_server():
async with irc_connect('irc.freenode.net#python-fr') as irc:
async for message in irc:
# do something useful with message
async def web_server():
async with web_connect('localhost:8080') as web:
async for request in web:
# do something useful with request
loop = asyncio.get_event_loop()
loop.create_task(irc_server())
loop.create_task(web_server())
loop.run_forever()
因此,两个协程无法通信。要使 HTTP 部分与 IRC 部分通信,您必须在两个协程之间共享一些内容。在生产中它很可能是某种数据库,但在伪代码中,它是一个简单的全局。你最终会得到这样的结果:
import asyncio
# value is shared between IRC and the web server.
value = None
async def irc_server():
global value
async with irc_connect('irc.freenode.net#python-fr') as irc:
async for message in irc:
# if message is echo, reply with the current value
# otherwise store the message as value
if message == 'echo':
irc.send(value)
else:
value = message
async def web_server():
global value
async with web_connect('localhost:8080') as web:
async for request in web:
if request.path == 'echo':
request.client.send(value)
else:
value = request.path # this is silly but simple
loop = asyncio.get_event_loop()
loop.create_task(irc_server())
loop.create_task(web_server())
loop.run_forever()