mido
提供了一个基于回调的API,该API将从另一个线程中调用回调。回调的实现可以通过调用与asyncio通信loop.call_soon_threadsafe
。请注意,您将无法仅设置a的值,Future
因为回调将被多次调用,并且future只能被设置一次-这意味着一次性计算。
多次调用回调的常见模式是将事件推送到asyncio队列,并在asyncio代码中弹出事件。通过将队列公开为异步迭代器,可以更加方便。此功能使过程自动化:
def make_stream():
loop = asyncio.get_event_loop()
queue = asyncio.Queue()
def callback(message):
loop.call_soon_threadsafe(queue.put_Nowait, message)
async def stream():
while True:
yield await queue.get()
return callback, stream()
make_stream
返回两个对象:
每当mido在其后台线程中调用回调时,async for
在流上迭代的asyncio循环都将唤醒一个新项。有效地make_stream
将线程回调转换为异步迭代器。例如(未测试):
async def print_messages():
# create a callback/stream pair and pass callback to mido
cb, stream = make_stream()
mido.open_input(callback=cb)
# print messages as they come just by reading from stream
async for message in stream:
print(message)