因為這個腳本不會長期使用,因此采取臨時辦法,新開一個子線程固定周期殺死phantomjs進程,這樣selenium就會在block最多不超過此周期后返回。當然在爬蟲腳本中做一些微調防止部分url被跳過
定時執行任務采用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()執行shell命令
使用sched模塊周期執行任務
sched模塊使用heapq保存event隊列,其event為namedtuple類型
sched需要提供兩個函數,一個用來獲取時間變化,一個用于等待一段時間,可自定義
基本API
sched.scheduler(time_func, sleep_func) 函數返回一個scheduler對象,timefunc是一個返回數字的計時函數,而sleepfunc可接受此數字參數,并延時相應時間
scheduler.enter(delay, priority, action, argument)在delay時間段后,用參數argument調用action, argument必須是一個tuple。若要在固定時刻運行,則應調用scheduler.enterabs
scheduler.cancel(event)取消定時任務。event為enter函數返回值
scheduler.run()開始執行
任務時間重疊
在執行任務時有可能要block一段時間,任務返回后可能已經超過下一個任務的定時時刻,這種情況下會立刻執行下一個任務,而不會跳過
周期執行
類似于遞歸調用,寫一個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定時殺進程的相關知識,希望能夠幫助到大家!
更多淺析python定時殺進程相關文章請關注PHP中文網!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com