【问题标题】:Kill a python process when busy in a loop在循环中忙碌时杀死一个python进程
【发布时间】:2020-12-08 19:43:32
【问题描述】:

我正在我的 Raspberry 上运行一个脚本。有时会发生程序冻结,所以我必须关闭终端并重新运行.py

所以我想“多处理”这个程序。我做了两个函数,第一个工作,第二个工作,检查时间,在条件为真的情况下杀死第一个函数的进程。

但是我尝试这样做:

def AntiFreeze():
    print("AntiFreeze partito\n")

    global stop
    global endtime
    global freq

    proc_SPN = multiprocessing.Process(target=SPN(), args=())
    proc_SPN.start()

    time.sleep(2)

    proc_SPN.terminate()
    proc_SPN.join()

if __name__ == '__main__':
    proc_AF = multiprocessing.Process(target=AntiFreeze(), args=())
    proc_AF.start()

主函数在一个进程上启动“AntiFreeze”函数,这个函数创建另一个进程来运行将完成我想要的工作的函数。

问题(我认为): 函数“SPN()”(即完成这项工作的函数)在一个很长的 while 循环中忙碌,该循环调用另一个 .py 文件中的函数。 所以当我使用proc_SPN.terminate()proc_SPN.kill() 时,什么都没有发生……为什么?

还有另一种方法可以强制终止进程吗?也许我必须做两个不同的程序?

提前感谢您的帮助

【问题讨论】:

  • 你能弄清楚程序为什么会死机吗?这可能比通过多处理增加一层复杂性更容易解决。
  • @Dschoni .. 实际上我不知道,我试图理解但它比看起来更复杂。我不得不在覆盆子上加一个风扇以防止它过热。添加风扇后,这个问题减少了很多。但有时还是会发生
  • 还有一件事,您应该省略目标参数中的括号。 proc_SPN = multiprocessin.Process(target=SPN)
  • target=AntiFreeze() 更改为 target=AntiFreeze — 否则,您将在创建 Process 对象的调用中调用目标。 target=SPN() 也有同样的问题。
  • 我在想,对于您的特殊问题,多处理可能会使事情变得更糟,因为您试图利用更多的 CPU 功率,如果过热是一个问题,可能会导致更多的故障。您可以尝试使初始程序更高效(例如使用更少的 CPU)或尝试人为地减慢它以节省 CPU 使用率,从而限制多余的热量。你能显示SPN函数的代码吗?

标签: python multiprocessing kill terminate sigint


【解决方案1】:

您在进程创建时调用您的函数,因此该进程很可能永远不会正确生成。您的代码应更改为:

def AntiFreeze():
    print("AntiFreeze partito\n")

    global stop
    global endtime
    global freq

    proc_SPN = multiprocessing.Process(target=SPN, args=())
    proc_SPN.start()

    time.sleep(2)

    proc_SPN.terminate()
    proc_SPN.join()

if __name__ == '__main__':
    proc_AF = multiprocessing.Process(target=AntiFreeze, args=())
    proc_AF.start()

此外,您不应使用全局变量(除非绝对必要)。您可以将所需的参数传递给 AntiFreeze 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2010-12-08
    • 2014-05-07
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多