gue*_*tli 9 python python-asyncio concurrent.futures python-multiprocessing
我对concurrent.futures有两个问题:
结论:time.sleep()不能被中断.一种解决方案是:您可以围绕它编写循环并进行短暂睡眠.
请参阅如何在python concurrent.futures中中断time.sleep()
结论:个人超时需要由用户实施.例如:对于每个超时,您可以调用wait().
是否ASYNCIO解决问题的论文?
在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值,并且当达到超时时,每个单独的实例都会抛出自己的异常.
| 归档时间: |
|
| 查看次数: |
3833 次 |
| 最近记录: |