Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion requirements_dev.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
moto
moto[all]
pytest
34 changes: 23 additions & 11 deletions taskqueue/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

def schedule_threaded_jobs(
fns, concurrency=DEFAULT_THREADS,
progress=None, total=None, batch_size=1
progress=None, total=None
):

if total is None:
Expand Down Expand Up @@ -38,7 +38,7 @@ def realupdatefn(iface):

def schedule_green_jobs(
fns, concurrency=DEFAULT_THREADS,
progress=None, total=None, batch_size=1
progress=None, total=None
):
import gevent.pool

Expand All @@ -51,29 +51,41 @@ def schedule_green_jobs(
desc = progress if isinstance(progress, STRING_TYPES) else None

pbar = tqdm(total=total, desc=desc, disable=(not progress))

results = []

exceptions = []

def add_exception(greenlet):
nonlocal exceptions
try:
greenlet.get()
except Exception as err:
exceptions.append(err)

def updatefn(fn):
def realupdatefn():
res = fn()
pbar.update(batch_size)
results.append(res)
ct = fn()
pbar.update(ct)
results.append(ct) # cPython list append is thread safe
return realupdatefn

pool = gevent.pool.Pool(concurrency)
for fn in fns:
pool.spawn( updatefn(fn) )
greenlet = pool.spawn( updatefn(fn) )
greenlet.link_exception(add_exception)

pool.join()
pool.kill()
pbar.close()

if exceptions:
raise_multiple(exceptions)

return results

def schedule_jobs(
fns, concurrency=DEFAULT_THREADS,
progress=None, total=None, green=False,
batch_size=1
progress=None, total=None, green=False
):
"""
Given a list of functions, execute them concurrently until
Expand All @@ -93,8 +105,8 @@ def schedule_jobs(
return [ fn() for fn in tqdm(fns, disable=(not progress or total == 1), desc=progress) ]

if green:
return schedule_green_jobs(fns, concurrency, progress, total, batch_size)
return schedule_green_jobs(fns, concurrency, progress, total)

return schedule_threaded_jobs(fns, concurrency, progress, total, batch_size)
return schedule_threaded_jobs(fns, concurrency, progress, total)


9 changes: 8 additions & 1 deletion taskqueue/taskqueue.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,6 @@ def insertfn(batch):
progress=('Inserting' if self.progress else False),
total=total,
green=self.green,
batch_size=batch_size,
)
cts = sum(cts)

Expand Down Expand Up @@ -584,5 +583,13 @@ def capturing_soloprocess_upload(*args, **kwargs):

return ct

# c/o https://stackoverflow.com/questions/12826291/raise-two-errors-at-the-same-time
def raise_multiple(errors):
if not errors:
return
try:
raise errors.pop()
finally:
raise_multiple(errors)