Пример:
Код: Выделить всё
import asyncio
class BackgroundTask:
def __init__(self):
self.task = asyncio.create_task(self.heartbeat()) # line to remove
pass
async def heartbeat(self):
while True:
await asyncio.sleep(1)
print("^")
def __del__(self):
print("bar deleted")
async def foo():
bar = BackgroundTask()
await asyncio.sleep(2)
bar.task.cancel() # line to remove
async def main():
await foo()
print("foo has ended")
await asyncio.sleep(2)
print("main ended")
asyncio.run(main())
Код: Выделить всё
^
foo has ended
main ended
bar deleted
Если вы прокомментируете из двух отмеченных строк (т. е. удалил задачу), то я получаю ожидаемое поведение - объект удаляется непосредственно перед тем, как foo возвращается в основной
Код: Выделить всё
bar deleted
foo has ended
main ended
Код: Выделить всё
async def main():
while True:
await foo()
print("foo has ended")
await asyncio.sleep(2)
На самом деле это так. для приложения MicroPython, поэтому, если есть какая-либо разница в ответе для MicroPython, я хотел бы знать. (Для этой демонстрации я использовал CPython, поскольку в MicroPython нет специального метода __del__())
Подробнее здесь: https://stackoverflow.com/questions/792 ... t-of-scope
Мобильная версия