深入淺析python定時殺進程
之前寫了個python腳本用selenium+phantomjs爬新帖子,在循環(huán)拉取頁面的過程中,phantomjs總是block住,使用WebDriverWait設(shè)置最長等待時間無效。用firefox替換phantomjs無改善
因為這個腳本不會長期使用,因此采取臨時辦法,新開一個子線程固定周期殺死phantomjs進程,這樣selenium就會在block最多不超過此周期后返回。當然在爬蟲腳本中做一些微調(diào)防止部分url被跳過
定時執(zhí)行任務采用sched模塊,很多人將其與crontab相提并論
殺死特定進程的命令
kill -9 pid命令可以無條件終止對應pid進程
獲取名為phantomjs的進程pid
ps命令列出進程信息
grep過濾得指定名字的進程信息
awk '{print $2}'提取第二列pid信息
最終命令為:kill -9 `ps -aux|grep phantomjs|awk '{print $2}'`
python可以用os.system()執(zhí)行shell命令
使用sched模塊周期執(zhí)行任務
sched模塊使用heapq保存event隊列,其event為namedtuple類型
sched需要提供兩個函數(shù),一個用來獲取時間變化,一個用于等待一段時間,可自定義
基本API
sched.scheduler(time_func, sleep_func) 函數(shù)返回一個scheduler對象,timefunc是一個返回數(shù)字的計時函數(shù),而sleepfunc可接受此數(shù)字參數(shù),并延時相應時間
scheduler.enter(delay, priority, action, argument)在delay時間段后,用參數(shù)argument調(diào)用action, argument必須是一個tuple。若要在固定時刻運行,則應調(diào)用scheduler.enterabs
scheduler.cancel(event)取消定時任務。event為enter函數(shù)返回值
scheduler.run()開始執(zhí)行
任務時間重疊
在執(zhí)行任務時有可能要block一段時間,任務返回后可能已經(jīng)超過下一個任務的定時時刻,這種情況下會立刻執(zhí)行下一個任務,而不會跳過
周期執(zhí)行
類似于遞歸調(diào)用,寫一個wrapper function,在任務里面再次定時下一次任務即可
def wrapper(func, delay): scheduler.enter(delay, 0, wrapper, (func, delay)) func()
最終代碼
import os, time, sched schedule = sched.scheduler(time.time, time.sleep) cmd = '''kill -9 `ps -aux|grep phantomjs|awk '{print $2}'` ''' def recycle_eval(c, inc): schedule.enter(inc, 0, recycle_eval, (c, inc)) os.system(c) print time.ctime(),'phantomjs killed' if __name__ == '__main__': inc = 180 schedule.enter(inc, 0, recycle_eval, (cmd, inc)) schedule.run()
以上所述是小編給大家介紹的python定時殺進程的相關(guān)知識,希望能夠幫助到大家!
相關(guān)文章
使用Python的package機制如何簡化utils包設(shè)計詳解
這篇文章主要給大家介紹了關(guān)于使用Python的package機制如何簡化utils包設(shè)計的相關(guān)資料,文中通過示例代碼的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-12-12利用Matplotlib繪制折線圖、散點圖、柱狀圖、直方圖、餅圖的實例
這篇文章主要介紹了利用Matplotlib繪制折線圖、散點圖、柱狀圖、直方圖、餅圖的實例代碼,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09