mido提供了一个基于回调的API,该API将从另一个线程中调用回调。回调的实现可以通过调用与asyncio通信
loop.call_soon_threadsafe。请注意,您将无法仅设置a的值,
Future因为回调将被多次调用,并且future只能被设置一次-这意味着一次性计算。
多次调用回调的常见模式是将事件推送到asyncio队列,并在asyncio代码中d出事件。通过将队列公开为异步迭代器,可以更加方便。此功能使过程自动化:
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.open_input()
- 流,您可以对其进行迭代
async for
以获取新消息
每当mido在其后台线程中调用回调时,
asyncfor在流上迭代的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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)