【问题标题】:Restart a python script from backround_thread从 backround_thread 重新启动 python 脚本
【发布时间】:2015-08-05 12:22:42
【问题描述】:

我一直在寻找正确的代码,但没有成功。

我有以下带有后台线程和主程序的 python 脚本。一旦后台线程遇到条件,我想重新启动脚本。希望你能帮我解决这个问题。 TIA

使用此脚本,background_stuff 和“main”同时运行。

def background_stuff():
    while True:
        if condition == 'True':
            ### restart the script
t = Thread(target=background_stuff)
t.start()
### main
if __name__ == '__main__':
    while True:
          #do something

【问题讨论】:

  • 您需要重新启动整个脚本还是只运行主方法?
  • 我认为我们需要更多信息来帮助您。需要重启的时候主线程还在运行吗?如果是这样,您可能应该在自己的线程中运行主程序,然后阅读stackoverflow.com/questions/323972/… 了解如何终止它并在达到条件后在另一个线程中重新运行主方法。
  • @Metareven,我需要重新启动整个脚本。主脚本当前正在做什么并不重要。我尝试了“运行主方法”并且 background_stuff 作业停止了,因为 main() 也是一个非终止循环。请参阅编辑后的脚本。感谢您对此进行调查。

标签: python python-2.7 background-thread


【解决方案1】:

你能像这样重组你的脚本吗?

def main():
    t = Thread(target=background_stuff)
    t.start()
    while True:
        #do something

def background_stuff():
    while True:
        if condition == 'True':
            ### restart the script
#t = Thread(target=background_stuff)
#t.start()
### main
if __name__ == '__main__':
    main()

现在调用 main 应该会创建一个新线程来运行后台内容,并且脚本基本上会重新启动。唯一的问题是状态未重置。如果您需要重置状态,那么您实际上可以使用以下命令从脚本中从头开始运行您的脚本:

os.system("yourScript.py -yourargs")

我认为这不是最佳实践...

无论您最终使用哪种解决方案,您仍然需要终止旧的主循环。这可以通过在“重新启动脚本”时设置一些标志来完成,然后让主循环定期检查该标志并在设置标志后进行受控关闭,或者您可以在另一个线程中运行主循环您可以全局访问或从其他线程访问,然后终止它。请记住,通常不建议强制关闭线程。

【讨论】:

  • 感谢 Metareven 的想法。我实际上得到了我想要的-“这可以通过在“重新启动脚本”时设置一些标志来完成,然后让主循环定期检查该标志并在设置标志后进行受控关闭”
猜你喜欢
  • 2023-03-13
  • 2020-09-13
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2023-03-02
  • 2023-03-27
相关资源
最近更新 更多