我请了一个室内设计师:
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上运行的最简单的方法是什么?
2条答案
按热度按时间ds97pgxw1#
这不是很漂亮,但我必须做一些类似的跨平台的方式,我想出了使用一个单独的线程。基于信号的系统并不能在所有平台上可靠地工作。
此类的使用可以 Package 在装饰器中,或者做成
with
上下文处理程序。YMMV公司。
vq8itlhq2#
此答案仅在Cygwin中有效。
...它可能不再与最新版本的Cygwin一起工作...
我发现这个timeout-decorator代码也非常方便。(我最初在这个问题的答案中找到它:如何限制函数调用的执行时间?)
为了让它在Windows上工作,我使用了随Cygwin一起安装的Python。
我运行setup-x86_64.exe,然后从Python文件夹中选择
python3
包(或者,如果您更喜欢Python 2,选择python
包)。为了将python3重命名为python 2,我定义了别名
从Cygwin命令提示符。因为我不经常使用这个功能,我可能不会把它放在.bashrc或任何东西。
相关问题:Python signal don't work even on Cygwin?