Passing async function as argument

5.4k Views Asked by At

I am trying to use use grequests to make a single HTTP call asynchronously. All goes find until I try to call a function (handle_cars) to handle the response. The problem is that the function is an async function and it I don't know how to await it while passing.

Is this even possible?

I need the function to be async because there is another async function I need to call from it. Another solution would be to be able to call and await the other async function (send_cars) from inside the sync function.

async def handle_cars(res):
    print("GOT IT")
    await send_cars()
async def get_cars():
    req = grequests.get(URL, hooks=dict(response=handle_cars))
    job = grequests.send(req, grequests.Pool(1))

How do I set the response argument to await the function? Or how do I await send_cars if I make handle_cars synchronous?

Thanks

1

There are 1 best solutions below

2
On

According to the OP's comments, he wishes to create a request in the background, and call a callback when it finishes.

The way to do so can be implemented using asyncio.create_task() and using task.add_done_callback().

A simpler way however, will work by creating a new coroutine and running it in the background.

Demonstrated using aiohttp, it will work in the following way:

async def main_loop():
    task = asyncio.create_task(handle_cars(URL))
    while True:
        ...

async def handle_cars(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            await send_cars()