|
22 | 22 | import time |
23 | 23 | from concurrent.futures import Future |
24 | 24 | from queue import Queue |
| 25 | +from threading import Lock |
25 | 26 |
|
26 | 27 | logger = logging.getLogger(__name__) |
27 | 28 |
|
@@ -191,45 +192,42 @@ def __init__(self, max_workers=10, stack_size=None): |
191 | 192 | self.__workers = [ |
192 | 193 | _QThreadWorker(self.__queue, i + 1, stack_size) for i in range(max_workers) |
193 | 194 | ] |
| 195 | + self.__shutdown_lock = Lock() |
194 | 196 | self.__been_shutdown = False |
195 | 197 |
|
196 | 198 | for w in self.__workers: |
197 | 199 | w.start() |
198 | 200 |
|
199 | 201 | def submit(self, callback, *args, **kwargs): |
200 | | - if self.__been_shutdown: |
201 | | - raise RuntimeError("QThreadExecutor has been shutdown") |
| 202 | + with self.__shutdown_lock: |
| 203 | + if self.__been_shutdown: |
| 204 | + raise RuntimeError("QThreadExecutor has been shutdown") |
202 | 205 |
|
203 | | - future = Future() |
204 | | - self._logger.debug( |
205 | | - "Submitting callback %s with args %s and kwargs %s to thread worker queue", |
206 | | - callback, |
207 | | - args, |
208 | | - kwargs, |
209 | | - ) |
210 | | - self.__queue.put((future, callback, args, kwargs)) |
211 | | - return future |
| 206 | + future = Future() |
| 207 | + self._logger.debug( |
| 208 | + "Submitting callback %s with args %s and kwargs %s to thread worker queue", |
| 209 | + callback, |
| 210 | + args, |
| 211 | + kwargs, |
| 212 | + ) |
| 213 | + self.__queue.put((future, callback, args, kwargs)) |
| 214 | + return future |
212 | 215 |
|
213 | 216 | def map(self, func, *iterables, timeout=None): |
214 | 217 | raise NotImplementedError("use as_completed on the event loop") |
215 | 218 |
|
216 | 219 | def shutdown(self, wait=True): |
217 | | - if self.__been_shutdown: |
218 | | - raise RuntimeError("QThreadExecutor has been shutdown") |
219 | | - |
220 | | - self.__been_shutdown = True |
221 | | - |
222 | | - self._logger.debug("Shutting down") |
223 | | - for i in range(len(self.__workers)): |
224 | | - # Signal workers to stop |
225 | | - self.__queue.put(None) |
226 | | - if wait: |
227 | | - for w in self.__workers: |
228 | | - w.wait() |
| 220 | + with self.__shutdown_lock: |
| 221 | + self.__been_shutdown = True |
| 222 | + self._logger.debug("Shutting down") |
| 223 | + for i in range(len(self.__workers)): |
| 224 | + # Signal workers to stop |
| 225 | + self.__queue.put(None) |
| 226 | + if wait: |
| 227 | + for w in self.__workers: |
| 228 | + w.wait() |
229 | 229 |
|
230 | 230 | def __enter__(self, *args): |
231 | | - if self.__been_shutdown: |
232 | | - raise RuntimeError("QThreadExecutor has been shutdown") |
233 | 231 | return self |
234 | 232 |
|
235 | 233 | def __exit__(self, *args): |
|
0 commit comments