使用asyncio处理阻塞代码

5
首先,我查看了this, thisthis,虽然第一个有一些有用的信息,但它与此处不相关,因为我正在尝试迭代值。
以下是我想要做的事情的示例:
class BlockingIter:
    def __iter__(self):
        while True:
            yield input()

async def coroutine():
    my_iter = BlockingIter()
    #Magic thing here
    async for i in my_iter:
        await do_stuff_with(i)

我该如何处理这个问题?

(注意,BlockingIter 实际上是我正在使用的库(chatexchange),所以可能会有一些其他的复杂情况。)


你能详细说明一下你想要的行为吗?do_stuff_with(i) 是你唯一想异步执行的部分吗? - Thomas
不,我正在使用一个以asyncio为基础的框架进行工作,我必须与它一起工作。 - muddyfish
你可以使用 run_in_executor 来推进迭代器对象。因此,在循环中await loop.run_in_executor(None, next, it) 可以相当接近所需的行为。 - vaultah
@vaultah,可以了,谢谢!如果你想写一个答案,最终的代码是iter_messages = iter(my_iter);while 1:;i = await loop.run_in_executor(None, next, iter_messages) - muddyfish
我认为一个更好的问题是“如何异步获取用户输入”。 - Eric
这不是我想要的,但它作为一个最小化示例展示了导致我遇到问题的原因。 - muddyfish
1个回答

4

正如 @vaultah 所说,并且在 文档 中解释的那样,awaiting executorawait loop.run_in_executor(None, next, iter_messages))可能是你想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接