我正在通過Bottle框架控制一個由網頁控制的小型python應用程序。 問題是我有時在後臺運行線程,但如果Bottle實例是關閉的,例如通過Ctrl + C,它會掛起,因爲這些線程永遠不會被告知退出。 有沒有辦法趕上瓶服務器關機並調用一個方法來做一些清理?Python瓶子服務器關閉的運行方法
1
A
回答
0
__del__
。
喜歡的東西:
class MyApp(bottle.Bottle):
def __del__(self):
# clean up threads here
# from here it's just business as usual
app = MyApp()
@app.route('/')
def home()
return 'hello, world.\n'
app.run('127.0.0.1', 8080)
0
聽起來像是你想有一個上下文管理器:
from contextlib import contextmanager
#Code for server goes here
@contextmanager
def server_with_threads():
try:
spawn_thread_things()
yield MyServer()
finally:
close_thready_things()
#Or maybe here
with server_with_threads() as server:
server.run('127.0.0.1', 8080)
一旦你的服務器正常關閉,或者拋出一個異常(你有塊退出,基本上) ,那麼它會達到finally
的條件,並清理你的線程。
另一種選擇是atexit。
2
try
/finally
:
# start threads here
try:
bottle.run(...) # or app.run(...)
finally:
# clean up (join) threads here
編輯:感謝@linusg爲正確指出try塊甚至沒有必要的。最好只使用:
# start threads here
bottle.run(...) # or app.run(...)
# if we reach here, run has exited (Ctrl-C)
# clean up (join) threads here
0
如果你的線程不需要正常關閉,然後只是讓他們daemon線程和你的過程將沒有進一步的變化完全退出。
線程可以被標記爲「守護進程線程」。這個 標誌的意義在於,只有守護程序線程 剩下時,整個Python程序纔會退出。初始值是從創建線程繼承的。 標誌可以通過守護進程屬性設置。
t = threading.Thread(target=myfunc)
t.daemon = True
t.start()
# because t is a daemon thread, no need to join it at process exit.
NB,你的問題的措辭意味着你真正的問題是,他們造成的進程掛起退出,而不是他們需要免費資源,但它是值得指出這一點:
注意:守護程序線程在關機時突然停止。他們的資源 (如打開文件,數據庫事務等)可能不會正確釋放 。
相關問題
- 1. Gracefull關閉瓶子python服務器
- 2. 運行多個瓶子服務器並單獨關閉它們
- 3. 運行瓶服務器
- 4. 運行關閉github主服務器
- 5. 對服務器運行瓶頸測試
- 6. 現在軌服務器運行時關閉的終端無法再運行?
- 7. 測試瓶應用程序無需運行瓶服務器
- 8. 瀏覽器關閉時運行服務器端函數
- 9. 燒瓶:數據沒有保存在服務器重啓/關閉
- 10. POST瓶服務器與Python的XML
- 11. python瓶服務器中的線程
- 12. 刪除服務器鎖定的瓶子
- 13. cherrypy服務器上的瓶子+ ssl
- 14. 無法關閉服務器(nodeJS)
- 15. Eclipse無法關閉BEA WebLogic服務器
- 16. 關閉程序時運行方法?
- 17. 當遊戲關閉時如何調用服務器的方法
- 18. 什麼是從終端關閉服務器的正確方法?
- 19. 如何登錄到python和瓶子web服務器的文件?
- 20. 如何在服務器運行時關閉mysql審計日誌?
- 21. 當服務器關閉時,Powershell get-service會運行很長
- 22. 當Django服務器關閉時運行進程
- 23. 關閉連接服務器
- 24. 關閉XMLRPC服務器
- 25. Html2Canvas Appsot服務器關閉
- 26. 關閉服務器TensorFlow
- 27. 關閉Netty服務器
- 28. Socket.io - 關閉服務器
- 29. 關閉Java RMI服務器
- 30. TCP服務器不關閉,
也許你可以爲CTRL-C事件安裝一個信號處理程序,然後進行清理。 http://docs.python.org/2/library/signal.html – Cillier
好想法......如果我能夠處理任何瓶子關機,那就太好了。 –
聽起來像也許你想'守護進程'線程? (請參閱下面的答案 - 還有我的其他兩個答案。對不起,我被這個問題想起來了!:) –