這幾天在實踐的時候,有乙個問題一直在困擾我,比如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 方法直接終止執行緒並釋放掉鎖,容易造成一些對資料進行修改的執行緒出問題,例如導致多個執行緒讀到不一致的資料的情況。看看下面這個例子 要做的事情...