| 123456789101112131415161718192021222324252627282930313233343536 |
- import queue
- import threading
-
- from django.db import connection
-
-
- def run_concurrently(fn, kwargs=None, num_threads=5):
- exceptions = queue.Queue()
-
- def worker(**kwargs):
- try:
- fn(**kwargs)
- except Exception as exc:
- exceptions.put(exc)
- else:
- exceptions.put(None)
- finally:
- connection.close()
-
- kwargs = kwargs if kwargs is not None else {}
-
- # Run them
- threads = [
- threading.Thread(target=worker, name='thread-%d' % i, kwargs=kwargs)
- for i in range(num_threads)
- ]
- try:
- for thread in threads:
- thread.start()
- finally:
- for thread in threads:
- thread.join()
-
- # Retrieve exceptions
- exceptions = [exceptions.get(block=False) for i in range(num_threads)]
- return [exc for exc in exceptions if exc is not None]
|