【问题标题】:Using asyncio with blocking code使用带有阻塞代码的异步
【发布时间】:2017-08-27 20:49:21
【问题描述】:

首先,我查看了thisthisthis,虽然第一个有一些有用的信息,但这里不相关,因为我正在尝试迭代值。

这是我想做的事情的一个例子:

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) 是你想要异步完成的唯一部分吗?
  • 不,我正在使用 asyncio 作为基础的框架,我必须使用它
  • 嗯,你可以使用run_in_executor 来推进一个迭代器对象。所以awaiting loop.run_in_executor(None, next, it) 在一个循环中会相当接近所需的行为。
  • @vaultah 可以,谢谢!如果你想写一个答案,最后的代码是iter_messages = iter(my_iter);while 1:;i = await loop.run_in_executor(None, next, iter_messages)
  • 我认为更好的问题是“我如何异步获取用户输入”

标签: python iterator python-asyncio


【解决方案1】:

正如@vaultah 所说并在docsawaiting 中解释的那样,executor (await loop.run_in_executor(None, next, iter_messages)) 可能就是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多