监控卡住的python进程

Posted

技术标签:

【中文标题】监控卡住的python进程【英文标题】:monitor stuck python processes 【发布时间】:2011-10-25 05:24:19 【问题描述】:

我有一个使用 urllib2 执行 URL 请求的 python 脚本。我有一个由 5 个进程组成的池,它们异步运行并执行一个功能。该函数是进行 url 调用、获取数据、将其解析为所需格式、执行计算和插入数据的函数。每个 url 请求的数据量各不相同。

我使用 cron 作业每 5 分钟运行一次此脚本。有时当我执行ps -ef | grep python 时,我会看到卡住的进程。有没有一种方法可以让我跟踪多处理类中的进程含义,该类可以跟踪进程、它们的状态含义已完成、卡住或死亡等?这是一个代码sn-p:

这就是我调用异步进程的方式

pool = Pool(processes=5)
pool.apply_async(getData, )

以下是执行 urllib2 请求的 getData 的一部分:

try:
    Url = "http://gotodatasite.com"

    data = urllib2.urlopen(Url).read().split('\n')
except URLError, e:
    print "Error:",e.code
    print e.reason
    sys.exit(0)

有没有办法跟踪卡住的进程并重新运行它们?

【问题讨论】:

“卡住了?”你能解释一下这是什么意思吗? 为什么需要使用multiproccesing 运行它们?使用多个 cron 作业有什么问题? @Andrew:卡住是指挂起的进程。 @Nick:多处理的唯一原因是充分利用盒子。 使用进程而不是线程会消耗多少,每个进程需要 2 兆字节的内存?这并不重要。 【参考方案1】:

如果您倾向于使用多处理,请实施 ping 机制。我想您正在寻找因 I/O 速度慢而卡住的进程?

我个人会使用队列(不一定是队列服务器),例如~/jobs 是要处理的 URL 列表,然后有一个程序来处理第一个工作和执行它。然后这只是一个簿记问题 - 比如说,让程序记录它何时启动以及它的 PID 是什么。如果您需要终止慢速作业,只需终止 PID 并将作业标记为失败。

【讨论】:

【参考方案2】:

Google 获取 urllib2 和超时。如果达到超时,您将得到一个异常,并且该进程不再卡住。

【讨论】:

以上是关于监控卡住的python进程的主要内容,如果未能解决你的问题,请参考以下文章

子python进程卡住了

通过 Python 子进程运行时使用仪器获取 iDevices 卡住了

与 grep 一起使用时 Python 子进程调用卡住 |

停止 PabotLib 进程后,Jenkins 工作卡住了

Python程序加线程池卡住不动

logd进程卡住