Sobes.tech
Junior — Middle

What is the difference between tasks executed through regular tasks and tasks executed through shared_task?

sobes.tech AI

Answer from AI

In Python, asyncio tasks (Task) are wrappers around coroutines that are scheduled and executed in an event loop. shared_task is a concept that is not built into the standard asyncio, but is often used in third-party libraries or custom implementations for sharing the same task among multiple consumers.

Main differences:

  • Regular tasks (asyncio.Task): are created to run a coroutine and manage its execution. Each call to asyncio.create_task() creates a separate task that runs independently.

  • Shared_task: allows multiple consumers to get the result of the same task without rerunning the coroutine. This is useful when an operation should be performed once, and the result used multiple times.

Example of using shared_task (simplified):

import asyncio

class SharedTask:
    def __init__(self, coro):
        self._task = asyncio.create_task(coro)

    async def get_result(self):
        return await self._task

async def fetch_data():
    await asyncio.sleep(1)
    return 'data'

shared = SharedTask(fetch_data())

async def consumer(name):
    result = await shared.get_result()
    print(f"{name} got {result}")

async def main():
    await asyncio.gather(consumer('A'), consumer('B'))

asyncio.run(main())

Here, the coroutine fetch_data is run once, and two consumers receive the same result.

Thus, the difference is that regular tasks are independent and run separately, while shared_task provides shared use of the result of one task.