当前位置: 首页 > 面试题库 >

如何运行长期(无限)Python进程?

朱宇航
2023-03-14
问题内容

我最近开始尝试使用Python进行Web开发。到目前为止,我在将Apache与mod_wsgi结合使用以及针对python 2.7的Django
Web框架方面取得了一些成功。但是,我遇到了一些问题,这些问题导致流程不断运行,更新信息等。

我编写了一个脚本,称为“
daemonManager.py”,该脚本可以启动和停止所有或单个python更新循环(我应该将它们称为Daemon吗?)。它通过分叉,然后为应运行的特定功能加载模块并启动无限循环来做到这一点。它保存一个PID文件/var/run以跟踪过程。到现在为止还挺好。我遇到的问题是:

  • 有时,其中一个过程将退出。我ps在早上检查,过程刚刚结束。没有记录任何错误(我正在使用该logging模块),并且涵盖了我能想到的所有异常并记录了它们。我也不认为这些退出过程与我的代码有任何关系,因为我所有的过程都运行完全不同的代码并以非常相似的间隔退出。我当然是错的。在运行数天/数周后,Python进程死掉是正常的吗?我该如何解决这个问题?我是否应该编写另一个守护程序来定期检查其他守护程序是否仍在运行?如果该守护程序停止,该怎么办?我对如何处理这个不知所措。

  • 我如何以编程方式知道某个进程是否仍在运行?我将PID文件保存在其中,/var/run并检查PID文件是否存在,以确定进程是否正在运行。但是,如果该过程只是死于意外原因,则PID文件将保留。因此,每次进程崩溃(每周几次)时,我都必须删除这些文件,这会破坏目的。我想我可以检查一个进程是否正在文件中的PID上运行,但是如果另一个进程已经启动并被分配了死进程的PID怎么办?我的守护程序会认为该进程运行良好,即使它已经死了很长时间。再次我无所适从。

关于如何 最好地 运行无限Python进程的任何有用的答案,希望也能阐明上述问题,我会接受

我在Ubuntu机器上使用Apache 2.2.14。
我的Python版本是2.7.2


问题答案:

首先,我将指出这是管理长时间运行的过程(LRP)的 一种 方法-实际上并不是任何事情。

以我的经验,最好的产品来自专注于您要处理的特定问题,同时将支持技术委托给其他图书馆。在这种情况下,我指的是后台进程(双叉技术),监视和日志重定向的行为。

我最喜欢的解决方案是http://supervisord.org/

使用像supervisor这样的系统,您基本上编写了一个常规的python脚本,该脚本在陷入“无限”循环的同时执行任务。

#!/usr/bin/python

import sys
import time

def main_loop():
    while 1:
        # do your stuff...
        time.sleep(0.1)

if __name__ == '__main__':
    try:
        main_loop()
    except KeyboardInterrupt:
        print >> sys.stderr, '\nExiting by user request.\n'
        sys.exit(0)

这样编写脚本可以简化开发和调试过程(您可以在终端中轻松启动/停止它,并在事件发生时观察日志输出)。投入生产时,您只需定义一个调用脚本的主管配置(以下是定义“程序”的
完整 示例,其中许多是可选的:http : //supervisord.org/configuration.html#program -x-section-
example)。

监事有 一堆 的配置选项,所以我不会一一列举,但我会说,它专门解决你所描述的问题:

  • 后台/守护进程
  • PID跟踪(可以配置为在进程意外终止时重新启动该进程)
  • 正常登录脚本(如果使用日志记录模块而不是打印,则使用流处理程序,而不是打印),但让主管为您重定向到文件。


 类似资料:
  • 我正在迁移我的Android应用程序,目标是Android奥利奥。我正在运行一个服务,它应该无限期运行,以执行一个特定的任务。

  • 完成上一节的初次运行后,你肯定会发现一点:一旦你按下 Ctrl+C,停下标准输入输出,logstash 进程也就随之停止了。作为一个肯定要长期运行的程序,应该怎么处理呢? 本章节问题对于一个运维来说应该属于基础知识,鉴于 ELK 用户很多其实不是运维,添加这段内容。 办法有很多种,下面介绍四种最常用的办法: 标准的 service 方式 采用 RPM、DEB 发行包安装的读者,推荐采用这种方式。发

  • 本文向大家介绍python如何进行矩阵运算,包括了python如何进行矩阵运算的使用技巧和注意事项,需要的朋友参考一下 python进行矩阵运算的方法: 1、矩阵相乘 2、矩阵对应元素相乘 multiply()函数:数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致 3、矩阵点乘 4、矩阵求逆 5、矩阵转置 6、计算每一列、行的和 内容扩展: numpy矩阵运算 (1) 矩阵点乘:m=mult

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 问题内容: 我想要一个可以在后台运行直到停止的服务,即使启动该服务的组件已损坏并且也允许绑定到活动。怎么可能? 根据android绑定服务文档-有三种创建绑定服务的方法 扩展Binder类。 使用Messenger。 使用AIDL。 我已经使用Messenger(第二种方法)创建了绑定服务。活动通过其onStart()方法绑定到服务,并在其onStop()方法中取消绑定。两种消息传递方式(在活动和

  • 问题内容: 我的存储库每5分钟就会收到一次轮询。 但是我发现,如果jenkinsfile被完全破坏,则管道将失败,并显示“此阶段没有步骤”。 然后每5分钟它将重试一次并保持失败。 我该如何防范呢?我可以在某个地方设置阈值,以便这种情况不会永远消失吗? 问题答案: 如果使用的是scm轮询,则只有在发生更改时才应构建。听起来您可能正在按计划进行计划。这是声明性管道中每种语法的不同。 或者您可以做的是从