监控卡住的Python进程

5
我有一个使用urllib2执行URL请求的Python脚本。我有一个池子里有5个异步运行的进程,执行一个函数。这个函数是用来进行url调用、获取数据、解析数据到所需格式、执行计算和插入数据的。每个url请求的数据量都不同。
我使用cron作业每5分钟运行一次此脚本。有时候当我执行ps -ef | grep python命令时,会看到卡住的进程。是否有一种方法可以跟踪这些进程,即在multiprocessing类中跟踪进程,它们的状态意味着完成、卡住或死亡等等?以下是代码片段:
这是我调用异步进程的方式:
pool = Pool(processes=5)
pool.apply_async(getData, )

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

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)

有没有一种方法可以跟踪卡住的进程并重新运行它们?


1
"卡住了?" 你能解释一下这是什么意思吗? - andrew cooke
为什么需要使用“多进程”来运行它们?使用多个cron作业有什么问题吗? - Nick ODell
@Andrew:我所说的“stuck”是指挂起的进程。 - ash
@Nick:多进程的唯一原因是为了充分利用计算机。 - ash
1
使用进程而不是线程会消耗多少内存,每个进程2兆字节?这并不重要。 - Nick ODell
2个回答

1

如果你想使用多进程,可以实现一个ping机制。我猜你是在寻找因为慢速I/O而被卡住的进程?

个人建议使用队列(不一定是队列服务器),例如说~/jobs是一个要处理的URL列表,然后编写一个程序来获取第一个任务并执行它。接下来只需要进行一些记录工作,比如记录程序启动时间和PID。如果需要终止慢速任务,只需杀死相应的PID并将该任务标记为失败即可。


0

谷歌搜索urllib2和timeout。如果超时,则会弹出异常,进程不再被卡住。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接