在不使用contextlib的情况下设置函数超时时间。

38 浏览
0 Comments

在不使用contextlib的情况下设置函数超时时间。

我在网上查找了一些关于如何在一段时间内运行代码的SO讨论和ActiveState的解决方案。看起来有一些常见的方法:\n

    \n

  • 使用一个运行代码的线程,并使用join函数设置超时时间。如果超时时间到了,就终止线程。但是这在Python中不被直接支持(使用了私有的_Thread__stop函数),因此这是一个不好的做法
  • \n

  • 使用signal.SIGALRM - 但这种方法在Windows上无法工作
  • \n

  • 使用带有超时的子进程 - 但这太重了,如果我想经常启动可中断的任务,我不想每次都创建一个进程!
  • \n

\n那么,什么是正确的方法呢?我不是在寻求变通方法(例如使用Twisted和异步IO),而是真正解决实际问题的方法 - 我有一个函数,我只想在一定的超时时间内运行它。如果超时时间到了,我想要控制权回到我手上。而且我希望它能在Linux和Windows上都能工作。

0
0 Comments

在某些情况下,我们可能需要设置函数的超时时间,以避免函数在执行期间出现问题导致程序长时间等待或无响应。然而,有时我们希望在设置超时时间时不使用`contextlib`模块。以下是关于如何在不使用`contextlib`的情况下设置函数超时时间的一些内容。

如果问题与网络相关,可以尝试使用以下代码来设置超时时间:

import socket
socket.setdefaulttimeout(number)

这段代码的作用是导入`socket`模块,并使用`setdefaulttimeout`函数来设置默认的超时时间。其中,`number`代表超时时间的秒数。

这个问题的出现可能是因为,在某些情况下,我们不希望使用`contextlib`模块来设置函数的超时时间。可能是因为项目中没有引入该模块,或者出于其他一些原因,我们不希望使用该模块的功能。

为了解决这个问题,我们可以使用`socket`模块提供的`setdefaulttimeout`函数来设置函数的超时时间。通过调用这个函数,并传入适当的超时时间值,我们可以在不使用`contextlib`的情况下实现函数的超时时间设置。

总结起来,当我们需要设置函数的超时时间但又不想使用`contextlib`模块时,可以通过导入`socket`模块并调用`setdefaulttimeout`函数来实现超时时间的设置。

0
0 Comments

问题的原因是在于需要在不使用contextlib的情况下设置函数超时。解决方法是使用multiprocessing模块来实现函数超时。

代码中的import语句引入了time和multiprocessing两个模块。do_this_other_thing_that_may_take_too_long函数使用time.sleep来模拟一个耗时操作,并返回一个字符串。接下来,创建了一个multiprocessing.Pool对象,并指定进程数量为1。然后,通过apply_async方法来异步调用do_this_other_thing_that_may_take_too_long函数,并传入超时时间为8秒。接着,使用for循环来遍历超时时间的范围,并通过get方法来获取异步调用的结果。如果在超时时间内没有获取到结果,则会抛出multiprocessing.TimeoutError异常。最后,输出结果并结束程序。

这段代码中的关键是使用了multiprocessing模块来实现函数的超时。通过创建一个进程池,可以在子进程中运行函数,并设置超时时间。当超时时间到达时,子进程会被终止。这种方式可以实现函数的超时控制,而不需要使用contextlib模块。

使用multiprocessing模块的好处是可以在子进程中运行任意代码,包括C扩展,并能够进行一些清理操作。如果认为进程的创建和销毁过慢,可以提前创建一到两个子进程,并让它们在需要时执行任务。multiprocessing模块似乎就是这样做的,所以我会支持这个答案。

然而,使用进程的问题在于无法预先创建子进程并保持运行状态,因为当超时发生时需要终止子进程。所以在这种情况下,预先创建子进程的好处在哪里呢?

这取决于你的使用情况 - 你期望多频繁地终止子任务?我正在使用从这个答案修改的代码。在我的使用情况下,我可能需要在几千次运行中终止一个任务 - 如果不使用进程池,速度会非常慢。如果终止是一种常见情况,那么无论你做什么,速度都会很慢。

0
0 Comments

在Python中,如果我们想要在一段代码执行超时后终止它,我们可以使用contextlib模块中的timeout函数来设置超时时间。但是,问题是如何在不使用contextlib的情况下设置函数超时时间。

事实上,没有一个完全通用的解决方案。根据不同的领域,我们需要选择合适的解决方案。

如果我们想要为我们完全控制的代码设置超时时间,我们需要确保代码能够在执行过程中进行一些中断。例如,在事件驱动的系统中,我们可以将代码分解为小块。如果我们可以确保没有代码会长时间占用锁,我们还可以使用多线程来实现这一目的。然而,正确地处理锁问题实际上是相当困难的。

如果我们想要设置超时时间是因为我们担心代码失去控制(例如,我们担心用户会要求计算器计算9**(9**9)),那么我们需要在另一个进程中运行该代码。这是唯一足够隔离代码的简单方法。在事件系统或者不同的线程中运行代码是不够的。虽然我们也可以将代码分解成小块,类似于前一种解决方案,但是这需要非常小心地处理,并且通常不值得这样做;而且,这种方法无法完全替代直接运行Python代码所能实现的功能。

总之,要在Python中实现函数的超时设置,我们可以使用contextlib模块中的timeout函数。但是,如果我们不想使用contextlib,我们需要根据具体的需求选择合适的解决方案。如果我们完全控制代码,我们可以通过将代码分解为小块或使用多线程来实现超时功能。如果我们担心代码失去控制,我们需要在另一个进程中运行该代码以确保隔离性。无论选择哪种解决方案,都需要注意正确处理相关的问题。

0