【发布时间】: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