2016-08-11 3 views
0

最近、私はgunicornというコードを見ています。gunicorn WorkerTmp worker/workertmp.py

私は非常に混乱する問題があります。WorkerTmpの効果はworker/workertmp.pyにありますか?

gunicornバージョン:19.6.0

答えて

0

WorkerTmpは、アービタと労働者の間の心臓の鼓動の方法です。すべてのワーカーは1つのtmp(WorkerTmpのインスタンス)に関連し、WorkerTmpには一時ファイル(_tmp)が含まれています。

私たちが見ることができるように、作業員(例えば、sync.SyncWorker)として以下のコード、一時ファイルに関するメタデータ情報を修正するであろう、intervally WorkerTmp.notifyを呼び出します:アービタに戻ってきて

def notify(self): 
    try: 
     self.spinner = (self.spinner + 1) % 2 
     os.fchmod(self._tmp.fileno(), self.spinner) 
    except AttributeError: 
     # python < 2.6 
     self._tmp.truncate(0) 
     os.write(self._tmp.fileno(), b"X") 

を、アービタは意志メインループでワーカーが接続を失っていないかどうかを確認してください(arbiter.py:197)。しかしどのように? arbiter.pyショーでライン477よう:

if time.time() - worker.tmp.last_update() <= self.timeout: 

間隔が長く設定されたタイムアウトを超える場合、今と一時ファイルの最終更新時刻との間隔を確認し、我々は労働者が接続を失っていると思います。今、重要な点は、方法tmp.last_updateで、コードはすべてを示しています

def last_update(self): 
    return os.fstat(self._tmp.fileno()).st_ctime 

os.fchmodは、ファイルのst_ctimeを変更します。 "stat"を使用して、ファイルの3つの時間属性をチェックすることができます。