gpt4 book ai didi

python - 如何集成 Python mido 和 asyncio?

转载 作者:行者123 更新时间:2023-11-30 21:55:43 25 4
gpt4 key购买 nike

我有一个通过 MIDI 进行文件 I/O 的设备。我有一个使用 Mido 来下载文件的脚本,但它是一堆全局变量。我想整理它以正确使用 asyncio,但我不确定如何集成 mido 回调。我认为文档说我应该使用 Future 对象,但我不确定 mido 回调函数如何获取该对象。

最佳答案

mido 提供 callback-based API将从不同的线程调用回调。您的回调实现可以通过调用 loop.call_soon_threadsafe 与 asyncio 通信。 。请注意,您将无法仅设置 Future 的值。因为回调将被调用多次,而 future 只能设置一次 - 它适用于一次性计算。

多次调用回调的常见模式是将事件推送到 asyncio queue并在异步代码中从中弹出内容。通过将队列公开为异步迭代器,可以使这变得更加方便。此功能使该过程自动化:

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 在其后台线程中调用回调时,在流上迭代的 asyncio async for 循环都会唤醒一个新项目。实际上,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)

关于python - 如何集成 Python mido 和 asyncio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com