target시간(시작 후 1분 뒤)이 되면 코루틴기반 비동기로 my_callback 콜백 함수를 호출 시킨다
-- fut객체.add_done_callback 으로 등록하는 콜백함수에는 반드시 파라미터가 하나이상 이여야 한다.
import asyncio
import datetime
from typing import Union
class AA():
def __init__(self):
self.prevent_multi_task = True
async def wait_target_time(self, target_time: Union[datetime.datetime, str]):
if self.prevent_multi_task is True:
self.prevent_multi_task = False
if isinstance(target_time, str):
target_time = datetime.datetime.fromisoformat(target_time)
print(f"Waiting {target_time}")
print(f"res : {target_time > datetime.datetime.now()}")
i = 0
while target_time > datetime.datetime.now():
print(i)
i = i + 1
await asyncio.sleep(1)
print(f"wait_time def is END")
self.prevent_multi_task = True
else:
print("Task 누적 방지")
return False
if __name__ == '__main__':
def my_callback(arg):
# future 함수의 콜백으로 등록될 시, 인자값으로 _asyncio.Task 객체가 넘어온다. <- future 객체를 상속받음
print(f"\n\nmy_callback : {arg}")
print(type(arg))
print(arg.__dir__())
print(arg.result())
async def f_sleep():
aa = AA()
_one_minute = datetime.timedelta(minutes=1)
target_time = datetime.datetime.now() + _one_minute
# _one_minute = datetime.timedelta(seconds=7)
# target_time = datetime.datetime.now() + _one_minute
fut = asyncio.create_task(aa.wait_target_time(target_time))
fut.add_done_callback(my_callback)
while True:
# 프로그램 종료 block
print(" 프로그램 Processing")
await asyncio.sleep(1)
ev = asyncio.get_event_loop()
ev.run_until_complete(f_sleep())
출력
'언어 정리 > python_비동기관련_lib' 카테고리의 다른 글
asyncio : 동일한 Task 5번이상 누적 방어 코드 (0) | 2023.06.10 |
---|---|
비동기인풋, toolbar 터미널출력 << prompt-toolkit, curses (0) | 2022.12.22 |
코루틴으로 ROS2 작업 (0) | 2022.11.28 |
asyncio로 ros2_spin 구동예제 ( handler-agent-manager ) (0) | 2022.09.17 |
코루틴 과 Eventloop 그리고 Future (1) | 2022.09.14 |
댓글