2013-10-14 73 views
1

我正在通過Bottle框架控制一個由網頁控制的小型python應用程序。 問題是我有時在後臺運行線程,但如果Bottle實例是關閉的,例如通過Ctrl + C,它會掛起,因爲這些線程永遠不會被告知退出。 有沒有辦法趕上瓶服務器關機並調用一個方法來做一些清理?Python瓶子服務器關閉的運行方法

+0

也許你可以爲CTRL-C事件安裝一個信號處理程序,然後進行清理。 http://docs.python.org/2/library/signal.html – Cillier

+0

好想法......如果我能夠處理任何瓶子關機,那就太好了。 –

+0

聽起來像也許你想'守護進程'線程? (請參閱下面的答案 - 還有我的其他兩個答案。對不起,我被這個問題想起來了!:) –

回答

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

沒有。 run()不會在Ctrl-C上引發異常,所以try/finally不僅僅是需要的。相反,這將做到這一點:'#開始線程; bottle.run(...); #清理! – linusg

+1

@linusg我剛剛證實你確實是對的。回答編輯以反映您的改進。謝謝! –

+0

太棒了,所以這個答案是有效的:) – linusg

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,你的問題的措辭意味着你真正的問題是,他們造成的進程掛起退出,而不是他們需要免費資源,但它是值得指出這一點:

注意:守護程序線程在關機時突然停止。他們的資源 (如打開文件,數據庫事務等)可能不會正確釋放 。