Set Async Create Task to two Variables

Advertisements

I’m repurposing some synchronous python code to be asynchronous. It is working really well, but when I change this line of code

    l = asyncio.create_task(Functions.getData(session, id))

to this

    l, i = asyncio.create_task(Functions.getData(session, id))

I get a RuntimeError that says this.

"Exception has occurred: RuntimeError
await wasn't used with future
  File 'test.py', line 46, in get_tasks
    l, i = asyncio.create_task(Functions.getData(session, id))
    ^^^^
  File 'test.py', line 79, in get_data
    a, b, c = get_tasks(session)
                               ^^^^^^^^^^^^^^^^^^
  File 'test.py', line 108, in <module>
    asyncio.run(get_data())
RuntimeError: await wasn't used with future"

My getData function returns a tuple (var1, var2), but for some reason asyncio does not like it.

>Solution :

The issue is that when you use asyncio.create_task, it returns a single future object representing the task. If you want to unpack multiple values from the result of Functions.getData, you should do it after awaiting the task.

import asyncio

async def get_data(session, id):
    # Simulating some asynchronous operation
    await asyncio.sleep(1)
    return "result1", "result2"

async def get_tasks(session, id):
    task = asyncio.create_task(get_data(session, id))
    result = await task  # Wait for the task to complete
    var1, var2 = result
    return var1, var2

async def main():
    session = None  # Replace with your session
    id = 123  # Replace with your id
    var1, var2 = await get_tasks(session, id)
    print(var1, var2)

asyncio.run(main())

This way, you await the task and then unpack the results

Leave a ReplyCancel reply