import asyncio
import time

NAMES = ['Martha', 'John', 'Vasyan', 'Goga']


async def cb(context):
    nickname = context.get('nickname')
    print(f'CB FOR {nickname} CALLED')
    await asyncio.sleep(1)
    print(f'CB FOR {nickname} END')


async def f(name):
    print(f'{name} CALLED')
    await asyncio.sleep(2)
    print(f'{name} END')


async def test():
    futures = []
    for name in NAMES:
        fut = asyncio.ensure_future(f(name))
        fut.add_done_callback(lambda *args: asyncio.create_task(cb({'nickname': name})))
        futures.append(fut)

    await asyncio.gather(*futures)
    await asyncio.sleep(2)

start = time.time()
asyncio.run(test())
end = time.time()
print(f'Took {end-start} secs')
