mirror of https://github.com/nocturn9x/giambio.git
Fixed some edge cases with timeouts. Task.join() now returns the task's return value
This commit is contained in:
parent
587fba2dad
commit
584f762d61
|
@ -437,7 +437,10 @@ class AsyncScheduler:
|
||||||
while self.deadlines and self.deadlines.get_closest_deadline() <= self.clock():
|
while self.deadlines and self.deadlines.get_closest_deadline() <= self.clock():
|
||||||
pool = self.deadlines.get()
|
pool = self.deadlines.get()
|
||||||
pool.timed_out = True
|
pool.timed_out = True
|
||||||
if not pool.tasks and self.current_task is self.entry_point:
|
if self.current_task is self.entry_point:
|
||||||
|
self.paused.discard(self.current_task)
|
||||||
|
self.io_release_task(self.current_task)
|
||||||
|
self.reschedule_running()
|
||||||
self.handle_task_exit(self.entry_point, partial(self.entry_point.throw, TooSlowError(self.entry_point)))
|
self.handle_task_exit(self.entry_point, partial(self.entry_point.throw, TooSlowError(self.entry_point)))
|
||||||
for task in pool.tasks:
|
for task in pool.tasks:
|
||||||
if not task.done():
|
if not task.done():
|
||||||
|
@ -641,14 +644,16 @@ class AsyncScheduler:
|
||||||
task.joined = True
|
task.joined = True
|
||||||
if task.finished or task.cancelled:
|
if task.finished or task.cancelled:
|
||||||
if not task.cancelled:
|
if not task.cancelled:
|
||||||
|
# This way join() returns the
|
||||||
|
# task's return value
|
||||||
|
for joiner in task.joiners:
|
||||||
|
self._data[joiner] = task.result
|
||||||
self.debugger.on_task_exit(task)
|
self.debugger.on_task_exit(task)
|
||||||
if task.last_io:
|
if task.last_io:
|
||||||
self.io_release_task(task)
|
self.io_release_task(task)
|
||||||
# If the pool has finished executing or we're at the first parent
|
# If the pool has finished executing or we're at the first parent
|
||||||
# task that kicked the loop, we can safely reschedule the parent(s)
|
# task that kicked the loop, we can safely reschedule the parent(s)
|
||||||
if task.pool is None:
|
if not task.pool or task.pool.done():
|
||||||
return
|
|
||||||
if task.pool.done():
|
|
||||||
self.reschedule_joiners(task)
|
self.reschedule_joiners(task)
|
||||||
elif task.exc:
|
elif task.exc:
|
||||||
task.status = "crashed"
|
task.status = "crashed"
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
import giambio
|
||||||
|
from debugger import Debugger
|
||||||
|
|
||||||
|
|
||||||
|
async def child(name: int):
|
||||||
|
print(f"[child {name}] Child spawned!! Sleeping for {name} seconds")
|
||||||
|
await giambio.sleep(name)
|
||||||
|
print(f"[child {name}] Had a nice nap!")
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
start = giambio.clock()
|
||||||
|
try:
|
||||||
|
async with giambio.with_timeout(5) as pool:
|
||||||
|
task = await pool.spawn(child, 2)
|
||||||
|
print(await task.join())
|
||||||
|
await giambio.sleep(5)
|
||||||
|
except giambio.exceptions.TooSlowError:
|
||||||
|
print("[main] One or more children have timed out!")
|
||||||
|
print(f"[main] Children execution complete in {giambio.clock() - start:.2f} seconds")
|
||||||
|
return 12
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
giambio.run(main, debugger=())
|
Loading…
Reference in New Issue