Skip to content

Commit dbb62f8

Browse files
committed
Handling exceptions
1 parent 1c7ee9c commit dbb62f8

4 files changed

Lines changed: 74 additions & 71 deletions

File tree

src/executorlib/standalone/batched.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/executorlib/task_scheduler/interactive/dependency.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,37 @@ def _update_waiting_task(
357357
if len(wait_lst) == len(wait_tmp_lst):
358358
sleep(refresh_rate)
359359
return wait_tmp_lst
360+
361+
362+
def batched_futures(
363+
lst: list[Future], nested_skip_lst: list[Future[list]], n: int
364+
) -> list[list]:
365+
"""
366+
Batch n completed future objects. If the number of completed futures is smaller than n and the end of the batch is
367+
not reached yet, then an empty list is returned. If n future objects are done, which are not included in the skip_set
368+
then they are returned as batch.
369+
370+
Args:
371+
lst (list): list of all future objects
372+
nested_skip_lst (list): nest list of individual results already assigned to previous batches
373+
n (int): batch size
374+
375+
Returns:
376+
list: results of the batched futures
377+
"""
378+
skip_set = {id(item) for f in nested_skip_lst for item in f.result()}
379+
380+
done_lst = []
381+
failed_lst = []
382+
n_expected = min(n, len(lst) - len(skip_set))
383+
for v in lst:
384+
if v.done():
385+
if check_exception_was_raised(future_obj=v):
386+
failed_lst.append(v)
387+
elif id(v.result()) not in skip_set:
388+
done_lst.append(v.result())
389+
if len(done_lst) == n_expected:
390+
return done_lst
391+
if len(failed_lst) == n_expected:
392+
return failed_lst
393+
return []

tests/unit/standalone/test_batched.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

tests/unit/task_scheduler/interactive/test_dependency.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import numpy as np
77

88
from executorlib.task_scheduler.interactive.blockallocation import BlockAllocationTaskScheduler
9+
from executorlib.task_scheduler.interactive.dependency import batched_futures
910
from executorlib.standalone.interactive.spawner import MpiExecSpawner
1011

1112

@@ -141,3 +142,42 @@ def finished(self, future):
141142
foo.running,
142143
msg="After task completion, we expect the callback to modify the class",
143144
)
145+
146+
147+
class TestBatched(unittest.TestCase):
148+
def test_batched_futures(self):
149+
lst = []
150+
for i in range(10):
151+
f = Future()
152+
f.set_result(i)
153+
lst.append(f)
154+
batched_lst = [Future(), Future(), Future()]
155+
batched_lst[0].set_result([0, 1, 2])
156+
batched_lst[1].set_result([3, 4, 5])
157+
batched_lst[2].set_result([6, 7, 8])
158+
self.assertEqual(batched_futures(lst=lst, n=3, nested_skip_lst=set()), [0, 1, 2])
159+
self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst[:1], n=3), [3, 4, 5])
160+
self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst[:2], n=3), [6, 7, 8])
161+
self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst, n=3), [9])
162+
163+
def test_batched_futures_duplicated(self):
164+
lst = []
165+
for i in range(1,4):
166+
for _ in range(3):
167+
f = Future()
168+
f.set_result(i)
169+
lst.append(f)
170+
batched_lst = [Future(), Future(), Future()]
171+
batched_lst[0].set_result([1, 1, 1])
172+
batched_lst[1].set_result([2, 2, 2])
173+
batched_lst[2].set_result([3, 3, 3])
174+
self.assertEqual(batched_futures(lst=lst, n=3, nested_skip_lst=set()), [1, 1, 1])
175+
self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst[:1], n=3), [2, 2, 2])
176+
self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst[:2], n=3), [3, 3, 3])
177+
178+
def test_batched_futures_not_finished(self):
179+
lst = []
180+
for _ in list(range(10)):
181+
f = Future()
182+
lst.append(f)
183+
self.assertEqual(batched_futures(lst=lst, n=3, nested_skip_lst=set()), [])

0 commit comments

Comments
 (0)