2012-05-07 108 views

回答

7

在查看源代碼後,這很快就解決了。感謝直接鏈​​接到源代碼的文檔!

有一個ExitNow異常,您可以簡單地從應用程序提出,退出循環。

使用文檔中的EchoHandler示例,我已將其修改爲在接收數據時立即退出。

class EchoHandler(asyncore.dispatcher_with_send): 

    def handle_read(self): 
     data = self.recv(8192) 
     if data: 
      raise asyncore.ExitNow('Server is quitting!') 

另外,請記住,您可以趕上ExitNow讓你的應用程序不養,如果你在網絡內部使用它。這是我的一些來源:

def run(config): 
    instance = LockServer(config) 
    try: 
     asyncore.loop() 
    except asyncore.ExitNow, e: 
     print e 
5

asyncore循環也退出時沒有連接,所以你可以關閉連接。如果你有多個連接,那麼你可以使用asyncore.close_all()。

4

另一種方法是使用asyncore.loop調用的count參數。然後,您可以將asyncore.loop換成其他邏輯:

while(i_should_continue()): 
    asyncore.loop(count=1) 

這不會立即停止打開的連接或過早超時。但這可能是一件好事?我在啓動偵聽服務器時使用了這個功能。

+1

死亡這可能是正確的解決方案,如果你想停止從「循環外」的循環。上面的其他解決方案是用於停止循環內的循環。 –

5

試試這個:

服務器

一類(擴展asyncore.dispatcher):

class Server(asyncore.dispatcher): 

    def __init__(self, port): 
     asyncore.dispatcher.__init__(self) 

     self.host = socket.gethostname() 
     self.port = port 

     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.set_reuse_addr() 
     self.bind((self.host, self.port)) 
     self.listen(5) 
     print "[Server] Listening on {h}:{p}".format(h=self.host, p=self.port) 

    def handle_accept(self): 
     pair = self.accept() 
     if pair is not None: 
      sock, addr = pair 
      print "[ServerSocket] We got a connection from {a}".format(a=addr) 
      SocketHandler(sock) 

另一類爲誰去管理服務器的線程(繼承Thread)...檢查在run()方法,也就是我們稱之爲asyncore.loop():

class ServerThread(threading.Thread): 
    def __init__(self, port): 
     threading.Thread.__init__(self) 
     self.server = Server(port) 

    def run(self): 
     asyncore.loop() 

    def stop(self): 
     self.server.close() 
     self.join() 

現在啓動服務器:

# This is the communication server, it is going to listen for incoming connections, it has its own thread: 
s = ServerThread(PORT) 
s.start()    # Here we start the thread for the server 
print "Server is ready..." 
print "Is ServerThread alive? {t}".format(t=str(s.is_alive())) 
raw_input("Press any key to stop de server now...") 
print "Trying to stop ServerThread..." 
s.stop() 
print "The server will die in 30 seconds..." 

你會注意到,服務器不會立即死去......但它優雅地