1# Test waiting on a task
2
3try:
4    import uasyncio as asyncio
5except ImportError:
6    try:
7        import asyncio
8    except ImportError:
9        print("SKIP")
10        raise SystemExit
11
12
13try:
14    import utime
15
16    ticks = utime.ticks_ms
17    ticks_diff = utime.ticks_diff
18except:
19    import time
20
21    ticks = lambda: int(time.time() * 1000)
22    ticks_diff = lambda t1, t0: t1 - t0
23
24
25async def task(t):
26    print("task", t)
27
28
29async def delay_print(t, s):
30    await asyncio.sleep(t)
31    print(s)
32
33
34async def task_raise():
35    print("task_raise")
36    raise ValueError
37
38
39async def main():
40    print("start")
41
42    # Wait on a task
43    t = asyncio.create_task(task(1))
44    await t
45
46    # Wait on a task that's already done
47    t = asyncio.create_task(task(2))
48    await asyncio.sleep(0.001)
49    await t
50
51    # Wait again on same task
52    await t
53
54    print("----")
55
56    # Create 2 tasks
57    ts1 = asyncio.create_task(delay_print(0.04, "hello"))
58    ts2 = asyncio.create_task(delay_print(0.08, "world"))
59
60    # Time how long the tasks take to finish, they should execute in parallel
61    print("start")
62    t0 = ticks()
63    await ts1
64    t1 = ticks()
65    await ts2
66    t2 = ticks()
67    print("took {} {}".format(round(ticks_diff(t1, t0), -1), round(ticks_diff(t2, t1), -1)))
68
69    # Wait on a task that raises an exception
70    t = asyncio.create_task(task_raise())
71    try:
72        await t
73    except ValueError:
74        print("ValueError")
75
76
77asyncio.run(main())
78