I have a device which does file I/O over MIDI. I have a script using Mido that downloads files but it is a mess of global variables. I want to tidy it up to use asyncio properly but I am not sure how to integrate the mido callback. I think the documentation says I should use a Future object but I am not sure how the mido callback function can obtain that object.
相关问题
- how to define constructor for Python's new Nam
- streaming md5sum of contents of a large remote tar
- How to get the background from multiple images by
- Evil ctypes hack in python
- Correctly parse PDF paragraphs with Python
mido
provides a callback-based API which will invoke the callback from a different thread. Your implementation of the callback can communicate with asyncio by callingloop.call_soon_threadsafe
. Note that you won't be able to just set the value of aFuture
because the callback will be called multiple times, and a future can only be set once - it is meant for one-shot computations.A common pattern for multiply invoked callbacks is to push events onto an asyncio queue and pop stuff from it in asyncio code. This can be made even more convenient by exposing the queue as an async iterator. This function automates the process:
make_stream
returns two objects:mido.open_input()
async for
to get new messagesWhenever the callback is invoked by mido in its background thread, your asyncio
async for
loop iterating over the stream will wake up with a new item. Effectively,make_stream
converts a threaded callback into an async iterator. For example (untested):