python殺死執行緒

2021-06-16 07:11:14 字數 4612 閱讀 1353

[源] = [

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的程序占用,繼續執行下面命...