pythonのタイムアウトプロセスを深く分析します。


以前はpythonシナリオを書いてselenium+phantomjsで新しい招待状を登って、循環してページを引き出します過程の中で、phantomjsはいつもblockに居住して、WebDriverWaitを使って設定します。firefoxで置換すると、phantomjsは改善されていません。
このスクリプトは長期的には使用されませんので、臨時的に、新しくサブスレッドを開いて固定周期でphantomjsプロセスを殺します。このようにseleniumはblockで最大でこのサイクルを超えない後に戻ります。もちろん、爬虫類シナリオの中で、一部のチューニングをして、urlがスキップされるのを防止します。
タイミング実行タスクはschedモジュールを採用し、多くの人がそれをcrontabと同列に扱う。
特定のプロセスを殺すコマンド

kill -9 pid pid
phantomjsと名付けられたプロセスpid
psコマンドはプロセス情報を一覧表示します。
grepフィルタで名前を指定するプロセス情報
awk'{print$2}'は第二列pid情報を抽出する。
最終命令は、キル-9`ps-aux grep phantomjs'{print$2}'`。
pythonはOS.system()でshell命令を実行できます。
schedモジュールを使ってサイクル実行タスク
schedモジュールはheappqを使用してイベントキューを保存し、そのイベントはnamedtupleタイプです。
schedは2つの関数を提供する必要があります。一つは時間変化を取得するために、一つは時間を待つために、カスタマイズできます。
基本API
sched.schedulerfunc,sleep_func関数はschedulerオブジェクトに戻ります。timefuncは数値を返すタイミング関数です。slepfuncはこの数値パラメータを受け入れて、時間を延ばします。
scheduler.enter(delay,prority,action,argment)はdelayの時間帯の後で、パラメーターargmentでactionを呼び出して、argmentは必ず一つのtupleでなければなりません。固定時刻で運行する場合は、scheduler.enterabsを呼び出すべきです。
scheduler.cancel(イベント)はタイミングタスクをキャンセルします。イベントはイベント関数の戻り値です。
scheduler.run()は実行を開始します。
ジョブ時間が重なっています
タスクを実行する時はブロック時間がかかりますが、ジョブが戻ったら次のタスクのタイミングを超えている可能性があります。この場合はスキップせずに次のタスクを実行します。
サイクル実行
再帰的呼び出しと同じように、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のタイムアウトプロセスに関する知识です。