Make sure to disconnect from the database when finished with the processes
This commit is contained in:
parent
efeb0dc655
commit
0ef17b082b
2 changed files with 20 additions and 6 deletions
|
@ -13,12 +13,13 @@ class QueueProcess(object):
|
|||
""" Helper class which invokes a worker in a process to produce
|
||||
data for one (or more) queues.
|
||||
"""
|
||||
def __init__(self, get_producer, chunk_size, max_size, args):
|
||||
def __init__(self, get_producer, chunk_size, max_size, args, finished=None):
|
||||
self._get_producer = get_producer
|
||||
self._queues = []
|
||||
self._chunk_size = chunk_size
|
||||
self._max_size = max_size
|
||||
self._args = args or []
|
||||
self._finished = finished
|
||||
|
||||
def create_queue(self):
|
||||
""" Adds a multiprocessing queue to the list of queues. Any queues added
|
||||
|
@ -29,14 +30,21 @@ class QueueProcess(object):
|
|||
return queue
|
||||
|
||||
@staticmethod
|
||||
def run_process(target, args):
|
||||
Process(target=target, args=args).start()
|
||||
def run_process(target, args, finished=None):
|
||||
def _target(tar, arg, fin):
|
||||
try:
|
||||
tar(*args)
|
||||
finally:
|
||||
if fin:
|
||||
fin()
|
||||
|
||||
Process(target=_target, args=(target, args, finished)).start()
|
||||
|
||||
def run(self):
|
||||
# Important! gipc is used here because normal multiprocessing does not work
|
||||
# correctly with gevent when we sleep.
|
||||
args = (self._get_producer, self._queues, self._chunk_size, self._args)
|
||||
QueueProcess.run_process(_run, args)
|
||||
QueueProcess.run_process(_run, args, finished=self._finished)
|
||||
|
||||
def _run(get_producer, queues, chunk_size, args):
|
||||
producer = get_producer(*args)
|
||||
|
|
Reference in a new issue