python 杀死线程,python 杀死进程
3358hi.baidu.com/leoomo/blog/item/C9BBF25C9FFE14B FAF2C006.html Python杀死线程星期三,2009年5月13日22:32
我也遇到过类似的问题,研究后的结论是问题出在python的API没有杀死线程。
Python线程只能去加入,或者发信号给线程终止。但是我用pycurl库的时候挂了网,他也没办法。
我的解决方案平台是相关的。我用getId获取Id,然后通过调用WindowsSDKAPI强制Trim。
使用子进程是一个很好的解决方案,因为python可以杀死一个进程。然而,进程之间的数据共享比线程复杂得多。
现在有另外一种解决方案,但是我没有研究过的是使用扭曲多线程模型。
我想不出别的了。希望你能提供更好的方案。
董给李写了几条建议:
1.你的服务过程应该是多样化的;靠自己;
2.服务进程应该将pid保存到文件中;
3.看门狗根据pid文件中的pid检查服务进程是否仍在运行;(运行状态是否正常可以和你说的时间对比);
4.一般来说,杀死那个服务进程是权限问题。所以可以考虑由watchdog直接启动服务进程,作为自己的子进程。
匕首
你的建议很好。这是一个非常好的主意。但是,我还不能使用看门狗启动子进程。我用叉子吗?再说,如果父进程可以直接扼杀子进程
程,问题很简单,
你能提供一个非常简单的例子吗?谢谢您们。
其实我考虑过用多线程。多线程程序也有同样的问题,就是主线程启动多个子线程后,可以监测到一个子线程长时间停止响应。
你可以知道那个线程有问题,往往是网络通信问题,但问题是主线程没有办法杀死或者终止子线程,只能发信号告诉子线程终止from。
拥有,
但是子线程已经停止响应了,可能是卡在网络通信里了,所以子线程杀不死,只好打开另一个线程,所以线程会越来越多。
现在回到进程处理,python可以从父进程创建一个子进程,并根据其pid杀死一个子进程吗?
有经验的程序专家,请给点意见。4月11日晚上10点48分,董力利登.@.写道:我做了一个爬虫程序,但是运行一段时间后,总是莫名其妙的停止工作。所以,我需要另一个监控程序,并定期检查爬虫程序是否正常工作,如果不正常就杀掉它。
进程,然后重新启动一个进程。我在linux下运行这个程序。
其实想法很简单。还有人在网上提出了这个思路,就是监控日志文件,让爬虫定时写日志文件(写当前时间),然后监控程序定时读取监控文件的最后一行。
然后与当前时间对比,如果时间差在允许范围内,爬虫正常工作;否则,需要杀死爬虫进程,重启爬虫。这个想法很简单,
应该也是有效的,但是在运行过程中发现监控程序无法杀死爬虫进程,导致运行一段时间后系统中出现大量爬虫程序。附代码如下,望高手,
或者有这方面经验的专家可以给我一些建议,不胜感激。最重要的是,我用
1、找到爬虫进程ID:
PS _ str= PS aux grep % s grep-v grep % proc _ name
# PS _ str= PS grep test long . py grep-v grep
x=os.popen(ps_str)。阅读()
2.扼杀进程
OS . system( kill % s % proc _ id 3)创建一个新进程。
os.system(。/% s %过程名)
是因为有了&号,这个进程才会在后台运行吗?甚至不可能去掉&符号。奇怪。
创建流程一定不能有问题。你可以创造很多。但是,目前我需要的只是一个行之有效的流程,所以当我发现行不通的时候就需要干掉它,但是我做不到。下面是一个需要长时间连续运行的任务的模拟,比如爬虫。
#!/usr/bin/env python
#编码=utf-8
$Id$
文件名 longtest.py
模拟一项需要长期工作的任务。
每隔一定时间写日志,另外一个监控程序定时检查日志,
如果日志最后时间和当前时间差距超过一定值,就杀掉
本程序,然后重新打开这个程序。
导入时间
import datetime def main():print now begin at ,datetime.datetime.now()
计数=1
而1:
计数=1
时间。睡眠(5)
如果计数为10:
str _ time=日期时间。日期时间。strftime(
datetime.datetime.now(), %Y-%m-%d %H:%M:%S )
fp=open(runlog.log , aw )
fp.write(%s\n %str_time
fp.close()
"打印"仍然有效.% s %计数
# 就是说执行10次之后,模拟本程序死掉了,不写日志了
否则:
"打印"不起作用.% s %计数
打印“完成”,日期时间。日期时间。now()if _ _ name _ _= _ _ main _ _ :
main()==============监控程序如下=============
#!/usr/bin/env python
#编码=utf-8导入操作系统
导入日期时间
导入时间#要杀掉的进程的名字描述字符串。
proc_name=testlong.py
monit_log=runlog.log
time_allow=60 #允许60秒的空闲,超过这个值看门狗返回0定义日志(字符串):
p=打开( proc.log , aw )
p.write(%s %s \n %(str,datetime.datetime.now()))
p.close()def看门狗():
检查一个日志文件,取出最后一条记录,
取出时间,和当前时间比较,看看是否超时。
超时是时间_允许
超时返回1, 不超时返回0
fp=open(monit_log, r )
lastline=fp.readlines()[-1].替换( \n ,)
fp.close()
打印最后一行
t1=日期时间。日期时间。strptime(最后一行, %Y-%m-%d %H:%M:%S )
时间差异=(日期时间。日期时间。现在()-t1).秒
打印你好上次运行距今%s秒% timediff
#时间比较
if timediff time_allow:
返回一
否则:
return 0 def restart _ proc(proc _ name):
重启指定的进程
PS _ str= PS aux grep % s grep-v grep % proc _ name
# PS _ str= PS grep测试long。 py grep-v grep
x=os.popen(ps_str).阅读()
#log x
如果x:
proc=x.split(\n )
对于进程中的行:
打印行
尝试:
proc_id=line.split()[0]
#log(获得pid: %s并将其杀死%proc_id )
os.system(kill %s %proc_id
日志( kill pid %s ok,开始新的%proc_id )
除了:
及格
否则:
# 没有找到要结束的进程,直接启动该进程
日志("未找到进程,启动它")
os.system(./% s %过程名def main():
而1:
如果看门狗():
重新启动进程(进程名)
否则:
打印好,编程好
时间。睡眠(20)如果_ _ name _ _== _ _ main _ _ :
你的董力
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。