当前位置: 首页 > 面试题库 >

Python异步强制超时

齐修贤
2023-03-14
问题内容

使用asyncio可以在超时的情况下执行协程,因此超时后将其取消:

@asyncio.coroutine
def coro():
    yield from asyncio.sleep(10)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait_for(coro(), 5))

上面的示例按预期方式工作(5秒后超时)。

但是,当协程不使用asyncio.sleep()(或其他异步协程)时,它似乎没有超时。例:

@asyncio.coroutine
def coro():
    import time
    time.sleep(10)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait_for(coro(), 1))

由于time.sleep(10)尚未取消,因此需要10秒钟以上才能运行。在这种情况下可以强制取消协程吗?

如果应使用asyncio解决此问题,我该怎么办?


问题答案:

不,您不能中断协程,除非协程将控制权交还给事件循环,这意味着它必须位于yield from调用内部。asyncio是单线程的,因此time.sleep(10)在第二个示例中阻塞调用时,无法运行事件循环。这意味着,当您使用设置的超时时间wait_for到期时,事件循环将无法对其执行操作。在coro退出之前,事件循环没有机会再次运行,这时为时已晚。

这就是为什么通常应始终避免任何非异步的阻塞调用的原因。每当调用阻塞而不产生事件循环时,程序中的其他任何内容都无法执行,这可能不是您想要的。如果确实需要执行长时间的阻塞操作,则应尝试使用BaseEventLoop.run_in_executor它在线程或进程池中运行它,这将避免阻塞事件循环:

import asyncio
import time
from concurrent.futures import ProcessPoolExecutor

@asyncio.coroutine
def coro(loop):
    ex = ProcessPoolExecutor(2)
    yield from loop.run_in_executor(ex, time.sleep, 10)  # This can be interrupted.

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait_for(coro(loop), 1))


 类似资料:
  • 我正在使用Java8,我想知道对3个异步作业强制超时的推荐方法,我将执行异步并从未来检索结果。请注意,所有3个作业的超时是相同的。如果超出时间限制,我还想取消作业。 我在想这样的事情: 像这样的东西有用吗?有更好的方法吗? 如何正确地取消未来?Javadoc说,线程不能被中断?所以,如果我取消一个未来,并调用,我会立即得到结果,因为线程不会被中断吗? 在等待结束后,是否建议使用run()或get(

  • 问题内容: 我使用Node.js和TypeScript,并且使用。这是我的测试用例: 我想为整个功能设置一个超时时间。即如果要花费2秒,花费0.5秒,花费5秒,我想在3秒钟后让我抛出错误的超时。 正常调用是一个问题,因为范围丢失了: 而且我不能用普通的方式抓住它: 有关如何解决的任何想法? 问题答案: 您可以使用超时: 您必须将其包装在诺言中才能使用。

  • 我有一个应用程序,它使用JSON定期(固定时间间隔,20秒)从服务器请求数据。 我目前的实现包括在一个异步任务中有一个循环,有一个20秒的“睡眠”条件。然而,这似乎不是一个好的实现。我的问题是有没有更好的实施方案。还有,有没有一种好的方法可以从主线程中强制停止异步任务。? 另一种选择是更改代码,让客户机发送一个请求,让服务器让服务器循环返回答案。哪一种更好的实施方式提前感谢:)

  • 问题内容: 是否可以 在调试时 强制抛出异常。 让我举一个例子:我正在调试一些代码,这些代码是我从互联网上下载页面的地方。当Internet连接断开或网卡断开时,应抛出IOException,但执行会被阻止(在第二行) 我需要一种在代码阻塞时 在调试 时强制引发异常的方法,以便可以跳转到catch块。 我正在使用netbeans BTW。 While Debugging =执行线程暂停时手动添加。

  • 问题内容: 我有一个的,我想传递给,但我需要节流请求第三方API。 我想避免等待传递给循环的东西,因为与此同时,我阻止了循环等待。我有什么选择?并限制同时运行的数量,但这不是我的问题。我需要将请求限制为100 / sec,但是完成请求所需的时间并不重要。 这是使用标准库的非常简洁(不起作用)的示例,演示了该问题。应该以100 /秒的速度节流,但以116.651 /秒的速度节流。 在asyncio中

  • 我有一个由Java config支持的Spring MVC应用程序,我想为所有涉及Callable的异步调用设置一个默认超时 我想有一个控制器(每个应用程序)有多少时间控制器有时间做它的东西之前请求超时。 我想要一个Java配置的示例,而不是xml

  • 问题内容: 我的量角器conf.js 函数需要发出一个看起来像这样的http请求, 它会引发错误, 还有其他方法可以强制在测试开始执行之前调用内部回调吗? 问题答案: 可以选择返回量角器在开始执行测试之前将解决的承诺: 可以选择返回一个承诺,量角器将在继续执行之前等待。如果准备工作涉及任何异步调用,例如与浏览器进行交互,则可以使用此方法。否则,量角器不能保证执行顺序,并可能在准备工作完成之前开始测

  • 异步绘制     UIKit的单线程天性意味着寄宿图通畅要在主线程上更新,这意味着绘制会打断用户交互,甚至让整个app看起来处于无响应状态。我们对此无能为力,但是如果能避免用户等待绘制完成就好多了。     针对这个问题,有一些方法可以用到:一些情况下,我们可以推测性地提前在另外一个线程上绘制内容,然后将由此绘出的图片直接设置为图层的内容。这实现起来可能不是很方便,但是在特定情况下是可行的。Cor