pythonタイミング殺しプロセス


pythonタイミング殺しプロセス
前にpythonスクリプトを書いてselenium+phantomjsで新しい投稿を登りましたが、ページをループして引き取る過程でphantomjsはいつもblockで止まり、WebDriverWaitを使って最長待ち時間を設定するのは無効です.phantomjsをfirefoxで置き換えると改善はありませんこのスクリプトは長期にわたって使用されないため、一時的な方法で、新しいサブスレッド固定サイクルを開いてphantomjsプロセスを殺し、seleniumはblockが最大でこのサイクルを超えない後に戻ります.もちろん爬虫類のスクリプトの中でいくつかの微調整をしてurlがスキップされることを防止しますタイミング実行タスクはschedモジュールを採用し、crontabと並ぶ人が多い.
特定のプロセスを殺すコマンドkill -9 pidコマンドは、対応pidプロセスを無条件に終了することができる.
phantomjsと名付けられたプロセスpid
psコマンドはプロセス情報をリストする
grepフィルタリング指定名のプロセス情報awk '{print $2}'第2列pid情報を抽出する.
最終コマンドは、kill-9`ps-aux|grep phantomjs|awk'{print$2}'`pythonはosを使うことができます.System()shellコマンドを実行する
schedモジュールサイクルを使用してタスクを実行
schedモジュールはheapqを使用してeventキューを保存し、そのeventはnamedtupleタイプである.
schedは2つの関数を提供する必要があります.1つは時間の変化を取得するために使用され、1つは時間を待つために使用され、をカスタマイズすることができます.
基本APIsched.scheduler(time_func, sleep_func)関数はschedulerオブジェクトを返し、timefuncは数値を返すタイミング関数であり、sleepfuncはこの数値パラメータを受け入れ、対応する時間を遅らせることができる.scheduler.enter(delay, priority, action, argument)は、delay期間の後、パラメータargumentactionを呼び出し、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()

著者のFocustcはCSDNから