|
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