gunicorn WorkerTmp worker / workertmp.py

时间:2016-08-11 08:07:29

标签: python gunicorn

最近,我查看gunicorn的代码。

我有一个非常令人困惑的问题,worker/workertmp.py WorkerTmp 的影响是什么?

  

gunicorn版本:19.6.0

1 个答案:

答案 0 :(得分:1)

WorkerTmp是Arbiter和Worker之间的心脏跳动方式。每个worker都与一个tmp(WorkerTmp的实例)相关,而WorkerTmp包含一个tempfile(_tmp)。

正如我们所看到的,worker(例如,sync.SyncWorker)将在intervally中调用WorkerTmp.notify,这将修改有关tempfile的元数据信息,代码如下:

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:

检查now和tempfile的最后更新时间之间的间隔,如果间隔超过配置的超时,我们认为工作者已断开连接。现在关键点是方法tmp.last_update,代码显示了所有内容:

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

os.fchmod将更改文件的st_ctime。我们可以使用&#34; stat&#34;检查文件的三个时间属性。