从concurrent.futures到asyncio

gue*_*tli 9 python python-asyncio concurrent.futures python-multiprocessing

我对concurrent.futures有两个问题:

如何在python concurrent.futures中打破time.sleep()?

结论:time.sleep()不能被中断.一种解决方案是:您可以围绕它编写循环并进行短暂睡眠.

请参阅如何在python concurrent.futures中中断time.sleep()

concurrent.futures的个别超时?

结论:个人超时需要由用户实施.例如:对于每个超时,您可以调用wait().

请参阅 concurrent.futures的各个超时

是否ASYNCIO解决问题的论文?

dec*_*eze 7

在asyncio模型中,执行由事件循环调度和协调.要取消执行当前挂起的任务,您基本上只需要不恢复它.虽然这在实践中有点不同,但显而易见的是,这使得在理论上取消暂停任务变得简单.

单个超时当然可以采用相同的方式:无论何时挂起协同程序等待结果,您都希望提供超时值.事件循环将确保在达到超时并且任务尚未完成时取消等待任务.

一些具体样本:

>>> import asyncio
>>> loop = asyncio.get_event_loop()
>>> task = asyncio.ensure_future(asyncio.sleep(5))
>>> task.cancel()
>>> loop.run_until_complete(task)
Traceback (most recent call last):
   ...
concurrent.futures._base.CancelledError
Run Code Online (Sandbox Code Playgroud)

在实践中,这可以使用以下内容实现:

class Foo:
    task = None

    async def sleeper(self):
        self.task = asyncio.sleep(60)
        try:
            await self.task
        except concurrent.futures.CancelledError:
            raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)

虽然这个方法是睡着了,但其他人可以打电话foo.task.cancel()来唤醒协程并让它处理取消.或者,无论谁打电话sleeper()都可以直接取消而不给它机会清理.

设置超时同样容易:

>>> loop.run_until_complete(asyncio.wait_for(asyncio.sleep(60), 5))
[ ... 5 seconds later ... ]
Traceback (most recent call last):
   ...
concurrent.futures._base.TimeoutError
Run Code Online (Sandbox Code Playgroud)

特别是在HTTP请求超时的上下文中,请参阅aiohttp:

async def fetch_page(session, url):
    with aiohttp.Timeout(10):
        async with session.get(url) as response:
            assert response.status == 200
            return await response.read()

with aiohttp.ClientSession(loop=loop) as session:
    content = loop.run_until_complete(fetch_page(session, 'http://python.org'))
Run Code Online (Sandbox Code Playgroud)

显然,每次调用都fetch_page可以决定自己的aiohttp.Timeout值,并且当达到超时时,每个单独的实例都会抛出自己的异常.

  • @guettli看一下[asyncio.subprocess](https://docs.python.org/3/library/asyncio-subprocess.html)模块和那些[例子](http://asyncio.readthedocs.io/ EN /最新/ subprocess.html). (2认同)