В последнее время я просматриваю код gunicorn
.gunicorn WorkerTmp worker/workertmp.py
У меня очень запутанная проблема, каков эффект WorkerTmp в worker/workertmp.py
?
версия gunicorn: 19.6.0
В последнее время я просматриваю код gunicorn
.gunicorn WorkerTmp worker/workertmp.py
У меня очень запутанная проблема, каков эффект WorkerTmp в worker/workertmp.py
?
версия gunicorn: 19.6.0
WorkerTmp сердце бьется путь между Арбитром и работником. Каждый рабочий связан с одним tmp (экземпляр WorkerTmp), а WorkerTmp содержит tempfile (_tmp).
Как мы можем видеть, работник (например, sync.SyncWorker
) будем называть 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). но как? в строке 477 в arbiter.py шоу:
if time.time() - worker.tmp.last_update() <= self.timeout:
проверки интервала между сейчас и последний раз, когда обновление TempFile, в случае, если интервал больше, чем сконфигурированный таймаут, мы считаем, что работник потерял связь. Теперь ключевым моментом является метод tmp.last_update
, код показывает все:
def last_update(self):
return os.fstat(self._tmp.fileno()).st_ctime
os.fchmod
изменит st_ctime
файла. мы можем использовать «stat» для проверки трех временных атрибутов файла.