如何立即退出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()