繁体   English   中英

收到KeyboardInterrupt时如何正确加入进程?

[英]How to properly join a process when KeyboardInterrupt received?

我有一台服务器,希望在单独的进程中运行该服务器并处理KeyBoardInterrupt异常以停止该服务器:

import multiprocessing as mp
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

def server_spawner():
  server = HTTPServer(('', 12345), BaseHTTPRequestHandler)
  try:
    server.serve_forever()
  except KeyboardInterrupt:
    server.shutdown()
    server.server_close()

if __name__ == '__main__':
  server_proc = mp.Process(target=server_spawner)
  server_proc.start()
  server_proc.join()

但是当我按CTRL+C我得到这样的回溯:

^CTraceback (most recent call last):
  File "data_miner.py", line 60, in <module>
    server_proc.join()
  File "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 145, in join
    res = self._popen.wait(timeout)
  File "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 154, in wait
    return self.poll(0)
  File "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 135, in poll
    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt

如何正确处理KeyBoardInterrupt并加入多进程程序中的进程?

摘自Jesse Noller的博客。

import multiprocessing as mp
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

def server_spawner():
    server = HTTPServer(('', 12345), BaseHTTPRequestHandler)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
        server.server_close()

if __name__ == '__main__':
    server_proc = mp.Process(target=server_spawner)
    server_proc.start()
    try:
        server_proc.join()
    except KeyboardInterrupt:
        server_proc.terminate()
        server_proc.join()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM