python 杀死线程,python 杀死进程

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: