我有一个让我抓狂的python脚本。现在我有一个无限循环,在特定的情况下检查数据并进入函数。
while true:
time.sleep(1)
peso = getPeso()
if peso > 900:
processo = multiprocessing.Process(target=processo_automatico)
processo.start()
processo.join()
andare() #this is where it should go after the process.
这个函数工作了很多次,但它不确定地挂在进程的末尾(实际上是完成并永远挂在那里。我怎么知道呢?我试过用日志(。
所以一开始我试图用退出代码终止它:
processo.join(timeout=10)
if processo.exitcode is None:
errore_cicalino() #this is just a warning for me
processo.kill()
elif processo.exitcode != 0:
errore_cicalino()
processo.kill()
但这从未奏效。从来没有。所以我尝试了不加入((。已尝试使用is_alive((。
time.sleep(10)
if processo.is_alive():
processo.terminate()
errore_cicalino()
即使是这样,它也从未进入这个if。这让我抓狂,我接受这个过程可能会失败的事实,但在超时之后,我应该能够终止它并继续执行脚本。
该脚本正在Raspberry Pi 4 2 GB上运行。
知道吗?
最小示例:
while True:
time.sleep(10)
processo = multiprocessing.Process(target=processo_automatico)
processo.start()
processo.join()
代码随机挂起在启动进程的末尾,不能以任何方式终止。processo_automatico((是一个函数,脚本从相机中获取图片,并通过另一个模块将其上传到数据库中。
def processo_automatico():
now = str(datetime.now())
now = now.replace(":", "-")
foto = CAMERA.read_camera()
cv2.imwrite("/var/www/html/" + now + ".png", foto)
DB.insert("/var/www/html/" + now + ".png", peso)
他们不会创建异常,我已经尝试在函数的末尾添加一个日志信息(即使代码挂起也会执行(
已解决。那是什么?好吧,我的重点是过程的结束,而问题就在开始的时候。看到函数getPeso((了吗?那个只是从序列中获取值。在得到这些值的几个小时后,树莓皮开始看到随机值,你必须重新启动才能修复它。我没有为此做好准备。我的函数变成了一个不间断的递归无限函数。我的建议是,不要使用无限循环,除非你真的需要,或者至少想想它是否会卡在某个地方并检查它