我正在通过Bottle框架开发一个由网页控制的小型python应用程序。 问题是我有时在后台运行线程但是如果Bottle实例关闭,例如通过Ctrl + C,它就会挂起,因为这些线程永远不会被告知要退出。 有没有办法捕获Bottle服务器关闭并调用方法进行一些清理?
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分: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)
一旦你的服务器正常关闭,或者抛出异常(你基本上退出with块),它就会达到finally
条件,并清理你的线程。
另一个选项是atexit。
答案 3 :(得分:0)
如果您的线程不需要正常关闭,那么只需创建daemon个线程,您的进程就会干净地退出而不需要进一步更改。
线程可以标记为“守护程序线程”。这个的意义 flag是只有守护进程线程时整个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.
N.B。,你问题的措辞意味着你真正的问题是他们导致你的进程在退出时挂起,而不是他们需要释放资源,但是值得指出这一点:
注意:守护程序线程在关闭时突然停止。他们的资源 (如打开文件,数据库事务等)可能无法发布 正常。