Skip to content

Commit 2413b10

Browse files
Fix tasks termination for Python 3.8
See discussion here: https://bugs.python.org/issue38559
1 parent 9ac7113 commit 2413b10

File tree

3 files changed

+37
-13
lines changed

3 files changed

+37
-13
lines changed

examples/camera.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ async def run():
1616
print(f"Drone discovered with UUID: {state.uuid}")
1717
break
1818

19-
asyncio.ensure_future(print_camera_mode(drone))
20-
asyncio.ensure_future(print_status(drone))
19+
print_mode_task = asyncio.ensure_future(print_mode(drone))
20+
print_status_task = asyncio.ensure_future(print_status(drone))
21+
running_tasks = [print_mode_task, print_status_task]
2122

2223
print("Setting mode to 'PHOTO'")
2324
try:
@@ -33,14 +34,20 @@ async def run():
3334
except CameraError as error:
3435
print(f"Couldn't take photo: {error._result.result}")
3536

36-
# Shut down the running coroutines (here 'print_camera_mode()' and
37+
# Shut down the running coroutines (here 'print_mode()' and
3738
# 'print_status()')
39+
for task in running_tasks:
40+
task.cancel()
41+
try:
42+
await task
43+
except asyncio.CancelledError:
44+
pass
3845
await asyncio.get_event_loop().shutdown_asyncgens()
3946

4047

41-
async def print_camera_mode(drone):
42-
async for camera_mode in drone.camera.mode():
43-
print(f"Camera mode: {camera_mode}")
48+
async def print_mode(drone):
49+
async for mode in drone.camera.mode():
50+
print(f"Camera mode: {mode}")
4451

4552

4653
async def print_status(drone):

examples/mission.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ async def run():
1616
print(f"Drone discovered with UUID: {state.uuid}")
1717
break
1818

19-
asyncio.ensure_future(print_mission_progress(drone))
20-
termination_task = asyncio.ensure_future(observe_is_in_air(drone))
19+
print_mission_progress_task = asyncio.ensure_future(print_mission_progress(drone))
20+
21+
running_tasks = [print_mission_progress_task]
22+
termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))
2123

2224
mission_items = []
2325
mission_items.append(MissionItem(47.398039859999997,
@@ -74,7 +76,7 @@ async def print_mission_progress(drone):
7476
f"{mission_progress.total}")
7577

7678

77-
async def observe_is_in_air(drone):
79+
async def observe_is_in_air(drone, running_tasks):
7880
""" Monitors whether the drone is flying or not and
7981
returns after landing """
8082

@@ -85,7 +87,14 @@ async def observe_is_in_air(drone):
8587
was_in_air = is_in_air
8688

8789
if was_in_air and not is_in_air:
90+
for task in running_tasks:
91+
task.cancel()
92+
try:
93+
await task
94+
except asyncio.CancelledError:
95+
pass
8896
await asyncio.get_event_loop().shutdown_asyncgens()
97+
8998
return
9099

91100

examples/telemetry_takeoff_and_land.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ async def run():
3535
break
3636

3737
# Start parallel tasks
38-
asyncio.ensure_future(print_altitude(drone))
39-
asyncio.ensure_future(print_flight_mode(drone))
40-
termination_task = asyncio.ensure_future(observe_is_in_air(drone))
38+
print_altitude_task = asyncio.ensure_future(print_altitude(drone))
39+
print_flight_mode_task = asyncio.ensure_future(print_flight_mode(drone))
40+
41+
running_tasks = [print_altitude_task, print_flight_mode_task]
42+
termination_task = asyncio.ensure_future(observe_is_in_air(drone, running_tasks))
4143

4244
# Execute the maneuvers
4345
print("-- Arming")
@@ -78,7 +80,7 @@ async def print_flight_mode(drone):
7880
print(f"Flight mode: {flight_mode}")
7981

8082

81-
async def observe_is_in_air(drone):
83+
async def observe_is_in_air(drone, running_tasks):
8284
""" Monitors whether the drone is flying or not and
8385
returns after landing """
8486

@@ -89,6 +91,12 @@ async def observe_is_in_air(drone):
8991
was_in_air = is_in_air
9092

9193
if was_in_air and not is_in_air:
94+
for task in running_tasks:
95+
task.cancel()
96+
try:
97+
await task
98+
except asyncio.CancelledError:
99+
pass
92100
await asyncio.get_event_loop().shutdown_asyncgens()
93101
return
94102

0 commit comments

Comments
 (0)