2011-04-19 11 views
0

還是端口我有一個將在一個不同的進程HTTP服務器調用對一些集成測試代碼。該服務器可能會受到活動污染,所以我希望能夠按需啓動和停止新實例。的Python atexit對在不同的工藝清理服務器上運行 - 在使用

這不幸是不工作...我遇到了我的地方是服務器上運行的端口,我的進程退出後仍處於鎖定狀態的情況下(這意味着如果我快兩倍運行測試,它失敗第二次因爲端口被鎖定)。

我使用atexit.register綁定的關閉方法試圖和它不工作要麼。

下面是該服務器的代碼:

from BaseHTTPServer import BaseHTTPRequestHandler 
import SocketServer 
import atexit 

class RestHTTPRequestHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     if self.path == '/sanitycheck': 
      self.send_response(200) 
      self.send_header('Content-type', 'application/json') 
      self.end_headers() 
      self.wfile.write("{ 'text': 'You are sane.' }") 
     else: 
      self.wfile.write(self.path) 

def kill_server(httpd): 
    open("/tmp/log", "w").write("KILLING") 
    httpd.shutdown() 

def start_simple_server(port): 
    httpd = SocketServer.TCPServer(("", port), RestHTTPRequestHandler) 
    atexit.register(kill_server, httpd) 

    httpd.serve_forever() 

    return httpd 

沒什麼東西可以寫到/ tmp /日誌這讓我覺得atexit是沒有得到調用。

這是我如何實例化服務器:

p = Process(target=start_simple_server, args=(port,)) 
p.start() 

然後當我做終止它,我只要致電:

p.terminate() 

這確實殺死進程,並應(我理解)觸發atexit電話 - 但它不是:(

有什麼想法?

回答

1

當您終止進程時,Python atexit不會運行。

>>>import atexit 
>>> def hook(): 
... print "hook ran" 
... 
>>> atexit.register(hook) 
<function hook at 0x100414aa0> 
>>> 
# in another terminal: kill <python process id> 
>>> Terminated 
+1

我認爲應該?我能做些什麼呢? – ashgromnies 2011-04-19 18:25:54

0

彼時我正在由大衛比茲利...服務器代碼的某些代碼風格稍微不同的方法:

from BaseHTTPServer import BaseHTTPRequestHandler 
import SocketServer 
import multiprocessing 
import cgi 
import urlparse 

class StoppableHTTPServerProcess(multiprocessing.Process): 
    def __init__(self, address, handler): 
     multiprocessing.Process.__init__(self) 
     self.exit = multiprocessing.Event() 

     self.server = StoppableHTTPServer(address, handler) 

    def run(self): 
     while not self.exit.is_set(): 
      self.server.handle_request() 

    def shutdown(self): 
     self.exit.set() 

class RestHTTPRequestHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     self.wfile.write(self.path) 


class StoppableHTTPServer(SocketServer.TCPServer): 
    allow_reuse_address = True 
    timeout = 0.5 

def start_simple_server(port): 
    process = StoppableHTTPServerProcess(("", port), RestHTTPRequestHandler) 
    return process 

調用代碼:

p = start_simple_server(port) 
p.start() 

當我做...

p.shutdown() 
相關問題