3
3
import signal
4
4
from asyncio import Task , gather , get_event_loop
5
5
from enum import Enum , auto
6
- from threading import Lock
7
6
from types import FrameType
8
7
from typing import Any , Callable , ClassVar , Optional , TypeVar
9
8
@@ -40,8 +39,7 @@ class Hook:
40
39
status : Status = Status .NOT_RUNNING_YET
41
40
funcs : ClassVar [list [Callable [[], Any ]]] = []
42
41
tasks : ClassVar [list [Task ]] = []
43
- callback : Task
44
- lock : Lock = Lock ()
42
+ callback : Task | None = None
45
43
46
44
@classmethod
47
45
def register (cls , func : Callable [[], T ]) -> Callable [[], T ]:
@@ -51,24 +49,23 @@ def register(cls, func: Callable[[], T]) -> Callable[[], T]:
51
49
@classmethod
52
50
def sig_handle (cls , original_handle : signal ._HANDLER ) -> SigHandleFunc :
53
51
def inner (signum : int , frame : FrameType | None ) -> None : # noqa: ARG001
54
- with cls .lock :
55
- if not cls .funcs :
56
- cls .status = Status .FINISHED
57
-
58
- if cls .status == Status .NOT_RUNNING_YET :
59
- loop = get_event_loop ()
60
- for i in cls .funcs :
61
- if is_coroutine_callable (i ):
62
- cls .tasks .append (loop .create_task (i ()))
63
- else :
64
- cls .tasks .append (loop .create_task (run_sync (i ())()))
65
- cls .status = Status .RUNNING
66
- cls .callback = loop .create_task (cls .check_task (signum ))
67
- elif cls .status == Status .RUNNING :
68
- logger .warning (f'signal { signum } received, but wait a minute pls' )
69
- elif cls .status == Status .FINISHED :
70
- signal .signal (signum , original_handle )
71
- signal .raise_signal (signum )
52
+ if not cls .funcs :
53
+ cls .status = Status .FINISHED
54
+
55
+ if cls .status == Status .NOT_RUNNING_YET :
56
+ cls .status = Status .RUNNING
57
+ loop = get_event_loop ()
58
+ for i in cls .funcs :
59
+ if is_coroutine_callable (i ):
60
+ cls .tasks .append (loop .create_task (i ()))
61
+ else :
62
+ cls .tasks .append (loop .create_task (run_sync (i )()))
63
+ cls .callback = loop .create_task (cls .check_task (signum ))
64
+ elif cls .status == Status .RUNNING :
65
+ logger .warning (f'signal { signum } received, but wait a minute pls' )
66
+ elif cls .status == Status .FINISHED :
67
+ signal .signal (signum , original_handle )
68
+ signal .raise_signal (signum )
72
69
73
70
return inner
74
71
0 commit comments