[源] = [
python殺死執行緒
2023年05月13日 星期三 22:32
我曾經碰到過類似問題,研究後的結論是,問題出在python沒有殺死執行緒的api上。
python對於執行緒只能去join,或者給執行緒傳送訊號來終止。但是我使用pycurl庫的時候,掛死在網路上,他就沒辦法了。
我的解決方案平台相關了,是使用getid來獲得id,然後通過windowssdkapi呼叫來強行trim。
用子程序是一種不錯的方案,因為python是可以kill掉某個程序的。不過相對來說,程序間資料共享比執行緒要複雜多了。
現在還有一種方案,但是我沒有研究的,是使用twisted的多執行緒模型。
其他就想不出了,希望大家提供更好的方案。
dong lee 寫道:
幾個建議:1、你那個服務程序應該自己daemonize;
2、服務程序應該儲存pid到檔案;
3、watchdog根據pid檔案中的pid檢查服務程序是否還在執行中;(執行狀態是否正常可以還是用你說的時間比對);
4、一般來說,殺不死那個服務程序是許可權問題,所以,可以考慮直接由watchdog作為自己的子程序來啟動服務程序。
dirk
您的建議非常好, 是一種非常好的思路. 不過我還不會用 watchdog 啟動子程序, 是用fork 嗎, 另外父程序如果直接能殺掉子進程, 那問題就簡單了,
您能提供乙個非常簡單的小例子嗎. 非常感謝.
其實我還考慮過用多執行緒來做, 多執行緒程式也同樣存在相同的問題, 就是主線程啟動了多個子執行緒之後, 是可以監控到某個子執行緒長時間停止響應,
己,現在回到程序處理這裡, python 可以用父程序建立子程序, 並根據子程序pid 殺掉某個子程序嗎.
有經驗的程式高手, 請指點一二 .
on 4月11日, 下午10時48分, li dong lidon...@... wrote:
做了乙個爬蟲程式, 不過執行一段時間後, 總是莫名奇妙的就不工作了, 所以,我需要另外乙個監控程式,定時看看爬蟲程式工作是否正常,不正常就kill掉程序,然後重啟乙個程序。
我是在linux 下面執行程式的。想法其實特別簡單, 別人在網上也提出過這個想法的,就是監控日誌檔案, 讓爬蟲程式定時寫日誌檔案(寫當前時間), 然後監控程式定時讀取監控檔案最後一行,
然後和當前時間比較, 如果時間差異在允許範圍內,算爬蟲工作正常, 否則,就要殺掉爬蟲程序,然後重啟爬蟲。 想法是如此簡單,
應該也是有效的,但是執行過程中,發現監控程式無法殺死爬蟲程序, 導致系統中執行了一段時間後,有大量的爬蟲程式, 要多少有多少。 附**如下, 望高手,
或者有這方面經驗的高手指點一二, 不勝感激。 主要就是我殺掉程序用的是
1, 找爬蟲程序id:
ps_str = 'ps aux |grep %s | grep -v grep' %proc_name
#ps_str = 'ps |grep testlong.py | grep -v grep'
x= os.popen(ps_str).read()
2, 殺程序
os.system('kill %s' %proc_id)
3, 新建乙個程序os.system('./%s &' %proc_name)
是因為那個 & 符號把程序防後台執行了嗎, 去掉那個 &符號也不行。 奇怪。
建立程序肯定沒問題,可以建立很多個。可是我目前只要有乙個程序能好好工作就行,所以我需要在發現程序不工作的時候去殺掉,但是卻沒辦法作到。
下面是乙個模擬需要長時間持續執行的乙個任務, 比如乙個爬蟲程式。**********== 監控程式如下 =============#!/usr/bin/env python
#coding=utf-8
'''$id$
filename "longtest.py"
模擬乙個需要持久工作的任務
每隔一定時間寫日誌, 另外乙個監控程式定時檢查日誌,
如果日誌最後時間和當前時間差距超過一定值,就殺掉
本程式,然後重新開啟這個程式。
'''import time
import datetime
def main():
print 'now begin at ',datetime.datetime.now()
count = 1
while 1:
count += 1
time.sleep(5)
if count < 10:
str_time = datetime.datetime.strftime(
datetime.datetime.now(), '%y-%m-%d %h:%m:%s')
fp = open('runlog.log','aw')
fp.write('%s\n' %str_time)
fp.close()
print 'still work... %s' %count
# 就是說執行10次之後,模擬本程式死掉了,不寫日誌了
else:
print 'dont work... %s' %count
print 'done', datetime.datetime.now()
if __name__ == '__main__':
main()
#!/usr/bin/env python
#coding=utf-8
import os
import datetime
import time
# 要kill掉的程序的名字描述字串.
proc_name = 'testlong.py'
monit_log = 'runlog.log'
time_allow = 60 # 允許60秒的空閒,超過這個值watchdog 返回0
def log(str):
p = open('proc.log','aw')
p.write('%s %s \n' %(str, datetime.datetime.now()))
p.close()
def watchdog():
'''檢查乙個日誌檔案,取出最後一條記錄,
取出時間,和當前時間比較,看看是否超時。
超時是time_allow
超時返回 1, 不超時返回 0
'''fp = open(monit_log,'r')
lastline = fp.readlines()[-1].replace('\n','')
fp.close()
print lastline
t1 = datetime.datetime.strptime(lastline, '%y-%m-%d %h:%m:%s')
timediff = (datetime.datetime.now() - t1).seconds
print u'上次執行距今 %s 秒' % timediff
#時間比較
if timediff > time_allow:
return 1
else:
return 0
def restart_proc(proc_name):
'''重啟指定的程序'''
ps_str = 'ps aux |grep %s | grep -v grep' %proc_name
#ps_str = 'ps |grep testlong.py | grep -v grep'
x= os.popen(ps_str).read()
#log x
if x:
proc = x.split('\n')
for line in proc:
print line
try:
proc_id = line.split()[0]
#log ('got pid: %s and kill it ' %proc_id )
os.system('kill %s' %proc_id)
log ('kill pid %s ok, starting new' %proc_id)
except:
pass
else:
# 沒有找到要結束的程序,直接啟動該程序
log ('not find proc, start it ')
os.system('./%s &' %proc_name)
def main():
while 1:
if watchdog():
restart_proc(proc_name)
else:
print 'ok, program well'
time.sleep(20)
if __name__=='__main__':
main()
yours li dong
python殺死執行緒
python殺死執行緒 2009年05月13日 星期三 22 32 我曾經碰到過類似問題,研究後的結論是,問題出在python沒有殺死執行緒的api上。python對於執行緒只能去join,或者給執行緒傳送訊號來終止。但是我使用pycurl庫的時候,掛死在網路上,他就沒辦法了。我的解決方案平台相關了...
python中殺死執行緒
import threading import time import inspect import ctypes def async raise tid,exctype raises an exception in the threads with id tid if not inspect.is...
查詢埠的占用, 殺死執行緒
假如我bai們需要確定誰占用了我du們的zhi80埠 在windows命令列視窗下執行dao c netstat aon findstr 80 tcp 127.0.0.1 80 0.0.0.0 0 listening 2448 看到了嗎,4102埠被1653程序號為2448的程序占用,繼續執行下面命...