python怎麼殺死乙個執行緒(可能題目說的不對)

2021-06-22 11:09:30 字數 2736 閱讀 1258

這幾天在實踐的時候,有乙個問題一直在困擾我,比如timer,定時器,python沒有這麼好的機制,需要自己實現。這個網上也是有一些。但是我自己的需求可能並不一樣。

需求:我需要乙個函式工作,比如遠端連線乙個埠,遠端讀取檔案等,但是我給的時間有限,比如,4秒鐘如果你還沒有讀取完成或者連線成功,我就不等了,很可能對方已經宕機或者拒絕了。這樣可以批量做一些事情而不需要一直等,浪費時間。

定時器是最好的,我覺得這個需求,一旦定時過了,就將這個讀取函式直接kill。但是這出現了問題。

第一,怎麼定時?

第二,時間到了,怎麼kill函式

第三,定時函式和kill函式怎麼判斷該kill了。

寫乙個多執行緒,乙個執行緒專門用來計時間,乙個用來執行函式,一旦時間到了,就殺死執行函式的執行緒。我在多執行緒,python很弱,似乎沒有這樣的比較簡單的乙個介面就呼叫的。不像windows程式設計。那麼,該怎辦?

結合我的需求,我這麼做:

1、在主程序執行,呼叫乙個程序執行函式,然後主程序sleep,等時間到了,就kill 執行函式的程序。

測試乙個例子:

import time

import threading

def p(i):

print i

class task(threading.thread):

def __init__(self,fun,i):

threading.thread.__init__(self)

self.fun = fun

self.i = i

self.thread_stop = false

def run(self):

while not self.thread_stop:

self.fun(self.i)

def stop(self):

self.thread_stop = true

def test():

thread1 = task(p,2)

thread1.start()

time.sleep(4)

thread1.stop()

return

if __name__ == '__main__':

test()

這樣就定了4秒鐘了。

問題還有乙個,如果函式讀取遠端檔案成功了,那麼需要立即返回,這個功能,上面的程式做不到,只能等4秒,那該怎麼做呢??

我們遺忘了乙個函式,join函式,這個函式式用來等待乙個執行緒結束的,如果這個函式沒有結束的話,那麼,就會阻塞當前執行的程式。

關鍵是,這個引數有乙個可選引數:

join([timeout]):  阻塞當前上下文環境的執行緒,直到呼叫此方法的執行緒終止或到達指定的

timeout

(可選引數)。

那麼我們的思路就是,在迴圈中一直呼叫乙個執行緒做任務,然後join(3),就會等3秒,3秒之後,我們判斷這個程序還存不存在,有函式isalive()

如果存在,說明已經超時了。我們可以呼叫之前寫的執行緒的結束函式主動結束執行緒。如果執行緒不存在,說明任務已經完成返回了。那麼我們就可以對成功做了任務的進行下一步操作。

具體**如下:

#!/usr/bin/env python

#-*-coding:utf-8-*-

'''author:cogbee

time:2014-6-13

function:readme

'''import pdb

import time

import threading

import os

#pdb.set_trace()

class task(threading.thread):

def __init__(self,ip):

threading.thread.__init__(self)

self.ip = ip

self.thread_stop = false

def run(self):

while not self.thread_stop:

#//新增你要做的事情,如果成功了就設定一下self.thread_stop變數。

if file != '':

self.thread_stop = true

def stop(self):

self.thread_stop = true

def test(eachline):

global file

list =

for ip in eachline:

thread1 = task(ip)

thread1.start()

thread1.join(3)

if thread1.isalive():

thread1.stop()

continue

#將可以讀取的都存起來

if file != '':

print list

if __name__ == '__main__':

eachline = ['1.1.1.1','222.73.5.54']

test(eachline)

我上面的程式不完整,你可以新增自己的**在我漢子寫的地方進行補全。這樣我們就能做到我說的那個需求了。

多執行緒程式設計:

這個博文寫的還是比較詳細。

具體想要看join函式等,我想你能找到更多的資料

殺死乙個遠端程序的方法

最近在寫乙個對程序操作的工具。經過參考別人的思路和自己的總結,掌握了在windows下對程序的一些處理方法。現,撰寫此文,一來留著備以後參考,二來也希望廣大給出更好的建議和思路,謝謝。話不多說,開始上 第乙個殺死乙個程序的方法,就是向該程序傳送關閉訊息。該方法只能在要殺死的程序有視窗的時候使用。如果...

linux 下如何殺死乙個應用

先把乾貨奉上,其實只有一行 以殺死chrome瀏覽器為例 ps aux grep chrome awk xargs i kill 稍微解釋一下,在winidow下殺死乙個無響應的應用很容易,在任務管理器裡找到,就能殺死。在linux下,殺死乙個應用一般不那麼容易做到。需要分成好多步驟 先要執行ps ...

那麼要怎麼終止乙個執行緒呢?

雖然thread.stop 方法可以結束乙個執行緒,但是eclipse已經將這個方法標註成乙個 廢棄 的方法,也就是不推薦使用,原因大家都知道,就是stop 方法直接終止執行緒並釋放掉鎖,容易造成一些對資料進行修改的執行緒出問題,例如導致多個執行緒讀到不一致的資料的情況。看看下面這個例子 要做的事情...