import asyncio

def create_timer(future, ms):
	async def inner():
		await asyncio.sleep(ms/1000)
		await future
	return asyncio.create_task(inner)
	

def create_interval(future, ms):
	async def inner():
		i = 0
		while True:
			print(f'{i} round')
			await asyncio.sleep(ms/1000)
			await future
			i += 1
	return asyncio.create_task(inner())
	
	
async def test_func():
	print('START TEST FUNC')
	await asyncio.sleep(1)  # some i/o operation
	print('END TEST FUNC')
	

async def main():
	print('START MAIN')
	t1 = create_interval(test_func(), 500)
	await asyncio.sleep(3)  # long await
	t1.cancel()
	print('TASK CANCELLED')
	await asyncio.sleep(3)
	print('END MAIN')
	
	
if __name__ == '__main__':
	asyncio.run(main())
	
	
	
	