mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
fix: fast shutdown (#4)
Break the poller wait by using shutdown event to let it know its time to wake up.
This commit is contained in:
parent
2f5b492339
commit
4f74f4a4b8
@ -74,6 +74,7 @@ class ThreadWorker(base.Worker):
|
||||
# initialise the pool
|
||||
self.tpool = None
|
||||
self.poller = None
|
||||
self.shutdown_event = os.eventfd(1)
|
||||
self._lock = None
|
||||
self.futures = deque()
|
||||
self._keep = deque()
|
||||
@ -97,6 +98,10 @@ class ThreadWorker(base.Worker):
|
||||
"""Override this method to customize how the thread pool is created"""
|
||||
return futures.ThreadPoolExecutor(max_workers=self.cfg.threads)
|
||||
|
||||
def handle_exit(self, sig, frame):
|
||||
self.alive = False
|
||||
os.eventfd_write(self.shutdown_event, 0)
|
||||
|
||||
def handle_quit(self, sig, frame):
|
||||
self.alive = False
|
||||
# worker_int callback
|
||||
@ -201,6 +206,9 @@ class ThreadWorker(base.Worker):
|
||||
acceptor = partial(self.accept, server)
|
||||
self.poller.register(sock, selectors.EVENT_READ, acceptor)
|
||||
|
||||
# This is just used to wake up the poller, nothing else needs to be done.
|
||||
self.poller.register(self.shutdown_event, selectors.EVENT_READ, lambda *args: None)
|
||||
|
||||
while self.alive:
|
||||
# notify the arbiter we are alive
|
||||
self.notify()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user