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

python:Windows相当于SIGALRM

邰德业
2023-03-14
问题内容

我有这个装饰器:

def timed_out(timeout):
    def decorate(f):
        if not hasattr(signal, "SIGALRM"):
            return f

        def handler(signum, frame):
            raise TimedOutExc()

        @functools.wraps(f)
        def new_f(*args, **kwargs):
            old = signal.signal(signal.SIGALRM, handler)
            signal.alarm(timeout)
            try:
                result = f(*args, **kwargs)
            finally:
                signal.signal(signal.SIGALRM, old)
            signal.alarm(0)
            return result

        new_f.func_name = f.func_name
        return new_f

    return decorate

该代码仅能在linux上执行任何操作,就像在Windows上一样SIGALRM。在Windows中也可以使用此代码的最简单方法是什么?


问题答案:

它不是很漂亮,但是我不得不以跨平台的方式做类似的事情,于是我想到了使用单独的线程。基于信号的系统无法在所有平台上可靠地工作。

此类的使用可以包装在装饰器中,也可以制成with上下文处理程序。

YMMV。

#!/usr/bin/env python2.7
import time, threading

class Ticker(threading.Thread):
  """A very simple thread that merely blocks for :attr:`interval` and sets a
  :class:`threading.Event` when the :attr:`interval` has elapsed. It then waits
  for the caller to unset this event before looping again.

  Example use::

    t = Ticker(1.0) # make a ticker
    t.start() # start the ticker in a new thread
    try:
      while t.evt.wait(): # hang out til the time has elapsed
        t.evt.clear() # tell the ticker to loop again
        print time.time(), "FIRING!"
    except:
      t.stop() # tell the thread to stop
      t.join() # wait til the thread actually dies

  """
  # SIGALRM based timing proved to be unreliable on various python installs,
  # so we use a simple thread that blocks on sleep and sets a threading.Event
  # when the timer expires, it does this forever.
  def __init__(self, interval):
    super(Ticker, self).__init__()
    self.interval = interval
    self.evt = threading.Event()
    self.evt.clear()
    self.should_run = threading.Event()
    self.should_run.set()

  def stop(self):
    """Stop the this thread. You probably want to call :meth:`join` immediately
    afterwards
    """
    self.should_run.clear()

  def consume(self):
    was_set = self.evt.is_set()
    if was_set:
      self.evt.clear()
    return was_set

  def run(self):
    """The internal main method of this thread. Block for :attr:`interval`
    seconds before setting :attr:`Ticker.evt`

    .. warning::
      Do not call this directly!  Instead call :meth:`start`.
    """
    while self.should_run.is_set():
      time.sleep(self.interval)
      self.evt.set()


 类似资料:
  • 问题内容: 我们曾经声明要在类之间传递数据,如下所示: 现在没有类,如何在类之间传递数据? 问题答案: Swift不区分属性和实例变量(即属性的基础存储)。要定义属性,只需在类的上下文中声明一个变量。 swift类只是ClassName.swift文件。 您将一个类和属性声明为 您可以通过点表示法访问属性值。作为Xcode6测试4的,也有访问修饰符(,并在SWIFT)。默认情况下,每个属性都是。有

  • 问题内容: 我正在将一些旧的PHP代码从mysql移植到MySQLi,但遇到了一个小问题。 有没有等效的旧功能? 当您处理多于1行时,我知道它比其他函数要慢,但是很多时候我只有1个结果和1个字段。使用它,我可以将4行压缩为1行。 旧代码: 所需代码: 但是没有这样的事情。:( 有什么我想念的吗?还是我必须吸收它并制作所有东西: 问题答案: PHP 5.4现在支持函数数组解引用,这意味着您可以执行以

  • 在我的应用程序中,我必须从主应用程序线程异步处理多个作业,并收集每个作业的结果。我有一个简单的Java解决方案,它使用ExecutorService和收集作业结果的ExecutorCompletionService来实现这一点。 现在我想把我的代码转换成Spring解决方案。这些文档向我展示了ExecutorService和@Async注释的使用方式,但我不确定如何以及是否可以收集多个作业的结果。

  • 问题内容: 我知道(其中e是一个异常)会打印发生的异常,但是,我试图找到与Java等效的python,它可以将异常确切地跟踪到发生的那一行,并打印出整个轨迹。 谁能告诉我Python 的等效功能吗? 问题答案: 在块内执行此操作时,它将自动使用当前异常。有关更多信息,请参见http://docs.python.org/library/traceback.html。

  • 问题内容: 从Java世界进入C#,是否有等效的HashMap?如果没有,您会推荐什么? 问题答案: 可能是最接近的。实现接口(类似于Java的接口)。 您应该注意一些明显的区别: 添加/获取项目 Java的HashMap具有用于设置/获取项目的和方法 C#的词典使用索引来设置/获取项目 键 Java 允许空键 如果您尝试添加空键,.NET会引发 添加重复密钥 Java 将用新值替换现有值。 如果

  • 问题内容: 是否有与 @Primary 等效的XML ,可以提升多个合格Bean之一 示例场景: 我有一个启用了自动配置功能的spring-boot应用程序。我已经定义了多个数据源,但是spring无法选择其中一个数据源作为其默认值。 datasources.xml 问题答案: 属性具有属性: 并记住: 如果通过XML声明了-annotated类,则注释元数据将被忽略,而是被尊重。