我在docs中找不到這個,但是我怎麼打算在不使用信號的情況下跳出asyncore.loop()
?如何從處理程序中退出異步調度程序?
6
A
回答
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)
這不會立即停止打開的連接或過早超時。但這可能是一件好事?我在啓動偵聽服務器時使用了這個功能。
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..."
你會注意到,服務器不會立即死去......但它優雅地
相關問題
- 1. Tornado異步處理程序
- 2. Python退出處理程序
- 3. Typo3調度程序處理異常?
- 4. 如何爲F#應用程序編寫退出處理程序?
- 5. WinRT異步處理程序中的WrongThreadException
- 6. javascript中事件處理程序的異步或同步調用
- 7. WCF異步調用 - 事件處理程序中的異常
- 8. 如何在C++中註冊線程退出處理程序?
- 9. 從Xamarin.Android事件處理程序異步調用WebAPI
- 10. 訪客將如何從異步處理程序體驗
- 11. Netty UDP處理程序 - 異步?
- 12. 完成處理程序異步
- 13. 等待事件處理程序異步
- 14. 異步頁面和處理程序
- 15. 異步任務和處理程序Android
- 16. 帶異步處理程序的Websocket
- 17. 異步等待處理程序死鎖
- 18. 如何從程序跳轉到Windows批處理退出
- 19. 存儲過程SQLWARNING退出處理程序不會被調用
- 20. 如何從python中的多重處理進程中退出主程序
- 21. 如何從事件處理程序中調用默認處理程序
- 22. 忽略MySQL退出處理程序
- 23. SIGSEGV處理程序不能退出
- 24. mysql退出處理程序幫助
- 25. 退出點擊處理程序
- 26. 如何在後臺處理調度異步進程?
- 27. 如何處理Metro應用程序的異步異常?
- 28. 如何測試異步異常處理程序
- 29. 正確處理線程中或通過WPF調度程序拋出的異常
- 30. Android中的處理程序vs異步調用
死亡這可能是正確的解決方案,如果你想停止從「循環外」的循環。上面的其他解決方案是用於停止循環內的循環。 –