简体   繁体   中英

Passing async function as argument

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

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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM