Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RuntimeWarning: coroutine 'main' was never awaited

Tags:

python

I'm trying to parse and put JSON async but getting:

RuntimeWarning: coroutine 'main' was never awaited

import asyncio
import aiohttp

async def get_put_content(url_get, url_put, session):
    async with session.get(url_get) as response:
        data = await response.read()

    async with session.put(url_put, data=data) as response:
        print(response.status)     

async def main():
    async with aiohttp.ClientSession() as session:
        for temp_id in range (1, 100):
            api_url = "https://api.link" + str(temp_id)
            bd_url = "http://127.0.0.1:5984/photosget/" + str(temp_id)
            asyncio.create_task(get_put_content(api_url, bd_url, session))

        asyncio.wait(get_put_content)

if __name__ == '__main__':
    main()

How I could use async correctly?

like image 858
vedufa Avatar asked Aug 07 '19 16:08

vedufa


People also ask

How do you cancel Asyncio tasks?

A Task is created and scheduled for its execution through the asyncio. create_task() function. Once scheduled, a Task can be requested for cancellation through task. cancel() method.

How do you stop a running event loop?

Run the event loop until stop() is called. If stop() is called before run_forever() is called, the loop will poll the I/O selector once with a timeout of zero, run all callbacks scheduled in response to I/O events (and those that were already scheduled), and then exit.

How do you await in Python?

The keyword await passes function control back to the event loop. (It suspends the execution of the surrounding coroutine.) If Python encounters an await f() expression in the scope of g() , this is how await tells the event loop, “Suspend execution of g() until whatever I'm waiting on—the result of f() —is returned.


1 Answers

As stated in the error message, you have to await for your main function as it is asynchronous. Borrowed from the Python3.7 documentation section about coroutines

Note that simply calling a coroutine will not schedule it to be executed

Given the fact that you want to run your toplevel entrypoint, in Python 3.7+ you should use

if __name__ == "__main__":
    asyncio.run(main())

For earlier versions you have to handle the event loop yourself:

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
like image 68
josoler Avatar answered Oct 21 '22 14:10

josoler