Skip to content

Commit 39ceb97

Browse files
authored
Hard stop worker by sending ctrl-c twice (#86)
Fixes #84
1 parent 2a9558c commit 39ceb97

File tree

1 file changed

+15
-5
lines changed
  • django_tasks/backends/database/management/commands

1 file changed

+15
-5
lines changed

django_tasks/backends/database/management/commands/db_worker.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import random
33
import signal
4+
import sys
45
import time
56
from argparse import ArgumentParser, ArgumentTypeError
67
from types import FrameType
@@ -33,16 +34,22 @@ def __init__(
3334
self.running_task = False
3435

3536
def shutdown(self, signum: int, frame: Optional[FrameType]) -> None:
37+
if not self.running:
38+
logger.warning(
39+
"Received %s - shutting down immediately.", signal.strsignal(signum)
40+
)
41+
sys.exit(1)
42+
3643
logger.warning(
37-
"Received %s - shutting down gracefully.", signal.strsignal(signum)
44+
"Received %s - shutting down gracefully... (press Ctrl+C again to force)",
45+
signal.strsignal(signum),
3846
)
39-
4047
self.running = False
4148

4249
if not self.running_task:
4350
# If we're not currently running a task, exit immediately.
4451
# This is useful if we're currently in a `sleep`.
45-
exit(0)
52+
sys.exit(0)
4653

4754
def configure_signals(self) -> None:
4855
signal.signal(signal.SIGINT, self.shutdown)
@@ -94,8 +101,11 @@ def start(self) -> None:
94101
# If we're running in "batch" mode, terminate the loop (and thus the worker)
95102
return None
96103

97-
# Wait before checking for another task
98-
time.sleep(self.interval)
104+
# If ctrl-c has just interrupted a task, self.running was cleared,
105+
# and we should not sleep, but rather exit immediately.
106+
if self.running:
107+
# Wait before checking for another task
108+
time.sleep(self.interval)
99109

100110
def run_task(self, db_task_result: DBTaskResult) -> None:
101111
"""

0 commit comments

Comments
 (0)