From 4c7e6b0440a624b735118ebed63d4dd38b5ee290 Mon Sep 17 00:00:00 2001 From: pchaseh Date: Wed, 7 Jun 2023 03:59:14 -0400 Subject: [PATCH] Replace select() usage with poll() --- gunicorn/arbiter.py | 9 +++++++-- gunicorn/workers/base.py | 6 ++++++ gunicorn/workers/sync.py | 8 ++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 08523d44c..9a89cae04 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -6,6 +6,7 @@ import os import random import select +import selectors import signal import sys import time @@ -76,6 +77,8 @@ def __init__(self, app): 0: sys.executable } + self.poller = select.poll() + def _get_num_workers(self): return self._num_workers @@ -181,6 +184,8 @@ def init_signals(self): util.set_non_blocking(p) util.close_on_exec(p) + self.poller.register(self.PIPE[0], selectors.EVENT_READ) + self.log.close_on_exec() # initialize all signals @@ -357,8 +362,8 @@ def sleep(self): A readable PIPE means a signal occurred. """ try: - ready = select.select([self.PIPE[0]], [], [], 1.0) - if not ready[0]: + events = self.poller.poll(1.0) + if len(events) < 1: return while os.read(self.PIPE[0], 1): pass diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index f321dd2d4..6354e2e42 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -6,9 +6,11 @@ import io import os import signal +import selectors import sys import time import traceback +import select from datetime import datetime from random import randint from ssl import SSLError @@ -62,6 +64,7 @@ def __init__(self, age, ppid, sockets, app, timeout, cfg, log): self.alive = True self.log = log self.tmp = WorkerTmp(cfg) + self.poller = select.poll() def __str__(self): return "" % self.pid @@ -113,6 +116,9 @@ def init_process(self): self.wait_fds = self.sockets + [self.PIPE[0]] + for fd in self.wait_fds: + self.poller.register(fd, selectors.EVENT_READ) + self.log.close_on_exec() self.init_signals() diff --git a/gunicorn/workers/sync.py b/gunicorn/workers/sync.py index 39a209f06..917972312 100644 --- a/gunicorn/workers/sync.py +++ b/gunicorn/workers/sync.py @@ -34,11 +34,11 @@ def accept(self, listener): def wait(self, timeout): try: self.notify() - ret = select.select(self.wait_fds, [], [], timeout) - if ret[0]: - if self.PIPE[0] in ret[0]: + events = self.poller.poll(timeout) + if len(events) > 0: + if any(self.PIPE[0] == fd for fd, _ in events): os.read(self.PIPE[0], 1) - return ret[0] + return events except select.error as e: if e.args[0] == errno.EINTR: