python - 使用 asyncio python 超时时取消进程
问题描述
我尝试在超时但 asyncio.wait_for 不起作用时取消进程。超时时如何取消进程。我的代码如下:
import asyncio
async def process():
# do something take a long time like this
for i in range(0,10000000000,1):
for j in range(0,10000000000,1):
continue
print('done!')
async def main():
# I want to cancel process when reached timeout
try:
await asyncio.wait_for(process(), timeout=1.0)
except asyncio.TimeoutError:
print('timeout!')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
解决方案
这不起作用,因为您的process
函数只是名称上的异步 - 它不会等待任何东西。这意味着它完全完成了,而没有给事件循环一个中断它的机会。由于 asyncio 是协作的(与其他基于 async/await 的系统一样),因此这样的函数不是正确编写的 async 函数并且不能被中断。
如果您将一个添加await asyncio.sleep(0.001)
到内部循环(或任何其他等待实际挂起的东西),您的代码将正常工作。
推荐阅读
- r - 将多个网格表添加到 pdf
- mysql - 同一张表上的 SQL 内连接
- clojurescript - 使用 Clojurescript 创建弹出窗口
- regex - 如何匹配出现在另一个单词之前的任何时候的单词,而不是在该单词之后?
- javascript - 如何在反应中动态更改配置文件中的值?
- r - R:按多个ID组合数据帧,如果匹配则按第二个ID对齐,否则插入NA
- java - 将不同类的pojo与共同属性进行比较
- css - SVG中风破折号数组CSS动画反转课程?
- swift - 如何用 PHCacheImageManager 替换 defaultImageManager
- javascript - JS用html文件重定向