首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何集成Python和异步?

如何集成Python和异步?
EN

Stack Overflow用户
提问于 2019-05-23 14:28:17
回答 1查看 900关注 0票数 5

我有一个设备可以在MIDI上记录I/O。我有一个使用Mido下载文件的脚本,但是它是一个混乱的全局变量。我想整理一下,以便正确地使用异步,但我不知道如何集成mido回调。我想文档中说我应该使用未来对象,但我不确定mido回调函数如何获得该对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 17:14:56

mido提供了一个基于回调 API,它将从不同的线程调用回调。回调的实现可以通过调用loop.call_soon_threadsafe与异步通信。请注意,您不能仅仅设置一个Future的值,因为回调将被多次调用,而且将来只能设置一次--它是用于一次的计算。

多调用回调的一个常见模式是将事件推送到异步队列上,并在异步代码中从其中弹出一些内容。通过将队列公开为异步迭代器,这将更加方便。此函数使该过程自动化:

代码语言:javascript
复制
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在后台线程中调用回调时,迭代流的异步async for循环就会唤醒一个新项。实际上,make_stream将线程回调转换为异步迭代器。例如(未经测试):

代码语言:javascript
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56277440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档