如何立即退出python程序,但仍让线程完成
我正在编写一种插件,它需要快速返回以避免调用程序超时,调用程序的时间间隔足够长,以准备数据,但准备信息所需的时间比允许的超时时间稍长,因此我从缓存文件返回信息,并启动一个线程,下次更新缓存文件。 但问题是,在线程完成之前,主文件可能不会退出,这使整个想法无效。 将线程设置为守护进程没有帮助。守护进程模式允许程序快速返回,但线程在完成之前会被终止,非守护进程模式阻止程序在线程完成之前快速返回 有没有办法立即退出程序,但仍然让线程完成其业务如何立即退出python程序,但仍让线程完成,python,multithreading,Python,Multithreading,我正在编写一种插件,它需要快速返回以避免调用程序超时,调用程序的时间间隔足够长,以准备数据,但准备信息所需的时间比允许的超时时间稍长,因此我从缓存文件返回信息,并启动一个线程,下次更新缓存文件。 但问题是,在线程完成之前,主文件可能不会退出,这使整个想法无效。 将线程设置为守护进程没有帮助。守护进程模式允许程序快速返回,但线程在完成之前会被终止,非守护进程模式阻止程序在线程完成之前快速返回 有没有办法立即退出程序,但仍然让线程完成其业务 #!/usr/bin/python import tim
#!/usr/bin/python
import time
import threading
def getinfofromcachefile():
print "This is very fast"
data = { "msg" : "old data" }
return data
def getfreshinfo():
time.sleep(5)
print "This takes a long time"
time.sleep(10)
data = { "msg" : "fresh data" }
return data
def update_cachefile():
data = getfreshinfo()
print "The data is now ready"
print data
def getinfo_fast():
data = getinfofromcachefile()
d = threading.Thread( name='update cache', target=update_cachefile )
d.setDaemon(False)
d.start()
return data
print getinfo_fast()
setDaemon的输出示例(False):
setDaemon的输出示例(True):
后者返回速度很快,但线程刚刚被终止在我看来,您需要的不仅仅是线程。如果您需要从主程序中快速终止并运行长时间的后台任务,则需要分叉。我现在无法测试,但我认为您应该尝试:
from multiprocessing import Process
#...
def getinfo_fast():
data = getinfofromcachefile()
p = Process(target=update_cachefile)
p.start()
# no join hence main program terminates
return data
print getinfo_fast()
Arthur的想法“不仅仅是线程”,让我无意中发现了python守护进程,
这对我很有帮助。我的程序现在执行getinfo_fast函数,然后立即返回提示符,但是getfreshinfo()在后台执行
您不希望程序退出,而是希望控件离开插件接口并返回调用方。如果在加载或初始化插件时生成了一个线程,则可以使用该线程来维护缓存。然后,当卸载或终止插件时(或者不管API是什么),您向线程发送信号,然后加入线程,然后退出程序。
user@server:/home/ubuntu# time ./snippet
This is very fast
{'msg': 'old data'}
real 0m0.010s
user 0m0.000s
sys 0m0.010s
from multiprocessing import Process
#...
def getinfo_fast():
data = getinfofromcachefile()
p = Process(target=update_cachefile)
p.start()
# no join hence main program terminates
return data
print getinfo_fast()
import daemon
#...
print getinfo_fast()
with daemon.DaemonContext():
getfreshinfo()