@@ -135,9 +135,21 @@ def __init__(self, preload_count: int):
135
135
self .preload_count = preload_count
136
136
self .backgrounds : List [BgData ] = []
137
137
self .tasks : List [aio .Task [None ]] = []
138
- self .task_signal = aio .Future [None ]()
138
+ self .task_signal : Optional [ aio .Future [None ]] = None
139
139
self .signal_wait_lock = aio .Lock ()
140
140
141
+ def _get_signal (self ) -> aio .Future [None ]:
142
+ if (not self .task_signal ) or self .task_signal .done ():
143
+ self .task_signal = aio .Future ()
144
+ return self .task_signal
145
+
146
+ def _wait_signal (self ):
147
+ async def inner ():
148
+ async with self .signal_wait_lock :
149
+ await self ._get_signal ()
150
+
151
+ return aio .wait_for (inner (), timeout = 15 )
152
+
141
153
def create_preload_task (self ):
142
154
async def task_func ():
143
155
logger .debug ("Started a preload background task" )
@@ -148,13 +160,13 @@ async def task_func():
148
160
# if error occurred this should be an unexpected error
149
161
# need to let this error raise
150
162
logger .opt (exception = e ).debug ("Exception when preloading" )
151
- if not self .task_signal .done ():
152
- self . task_signal .set_exception (e )
163
+ if not ( s := self ._get_signal ()) .done ():
164
+ s .set_exception (e )
153
165
else :
154
166
logger .debug ("A preload task done" )
155
167
self .backgrounds .append (bg )
156
- if not self .task_signal .done ():
157
- self . task_signal .set_result (None )
168
+ if not ( s := self ._get_signal ()) .done ():
169
+ s .set_result (None )
158
170
finally :
159
171
self .tasks .remove (task )
160
172
@@ -171,20 +183,11 @@ def start_preload(self, create_when_full: bool = False):
171
183
for _ in range (task_count ):
172
184
self .create_preload_task ()
173
185
174
- async def wait_signal (self ):
175
- async def inner ():
176
- async with self .signal_wait_lock :
177
- if self .task_signal .done ():
178
- self .task_signal = aio .Future ()
179
- await self .task_signal
180
-
181
- return await aio .wait_for (inner (), timeout = 15 )
182
-
183
186
async def get (self ) -> BgData :
184
187
if not self .backgrounds :
185
188
self .start_preload (create_when_full = True )
186
189
if self .tasks :
187
- await self .wait_signal ()
190
+ await self ._wait_signal ()
188
191
if not self .backgrounds :
189
192
raise RuntimeError ("Failed to wait background" )
190
193
bg = self .backgrounds .pop (0 )
0 commit comments