最近,我查看gunicorn
的代码。
我有一个非常令人困惑的问题,worker/workertmp.py
中 WorkerTmp 的影响是什么?
gunicorn版本:19.6.0
答案 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;检查文件的三个时间属性。