【问题标题】:How to exit program but a function is still running?如何退出程序但功能仍在运行?
【发布时间】:2015-09-20 02:24:09
【问题描述】:

例如,我正在编写一个基本的 wsgi 服务器程序。

这个程序运行完美,但服务器会一直运行,直到我按下 Ctrl-C。我希望程序在服务器运行 10 分钟后退出。

我已经尝试创建一个进程来退出程序,但我认为这不是必需的,而且它不起作用:

import time
import sys
from multiprocessing import Process
from wsgiref.simple_server import make_server
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'Hello']

def p_exit():
    time.sleep(600) 
    sys.exit()


p = Process(target=p_exit)
p.start()

httpd = make_server('', 80, application)
httpd.serve_forever()

【问题讨论】:

  • @JeffC 好吧,我已经尝试创建一个进程来退出程序……但我认为这不是必需的。
  • 就像你在学校所做的那样……请展示你的作品。 :) 这是在 SO 上回答问题的过程的一部分。它对您很有帮助,因为它迫使您调查自己的问题并仔细考虑。它还向读者证明你做了功课,并做出了合理的尝试来回答你自己的问题。第三,它可以帮助读者发现和诊断问题,从而为您提供更好的答案,减少我们浪费的时间。
  • @JeffC 好的,谢谢:)。让我编辑我的问题。
  • @JeffC 我刚刚编辑了我的问题。但是,这个解决方案非常复杂,而且行不通。
  • 嗯,我不确定,虽然在文档中,它说“由于 exit() 最终“仅”引发异常,它只会在从主线程调用时退出进程,并且异常未被拦截。”

标签: python wsgi


【解决方案1】:

您可以设置一个警报信号处理程序退出,并在 10 分钟内触发警报:

def handler(*args):
    sys.exit(1)

signal.signal(signal.SIGALRM, handler)
signal.alarm(60*10)

# Now start the wsgi application and wait
httpd = make_server('', 80, application)
httpd.serve_forever()

但是,ALRM 信号仅适用于 *nix,对于 Windows 系统,您需要尝试类似this

【讨论】:

  • 没问题,我在 Linux 上。让我试试这个。
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
相关资源
最近更新 更多