Skip to content

Instantly share code, notes, and snippets.

@samukasmk
Last active March 19, 2024 14:37
Show Gist options
  • Save samukasmk/88de861b9b1ae3c69e25acf98c34e63f to your computer and use it in GitHub Desktop.
Save samukasmk/88de861b9b1ae3c69e25acf98c34e63f to your computer and use it in GitHub Desktop.
Async.IO Example #2: Run 10 parallel tasks - But returning some results before all tasks to be done
import asyncio
from random import randint
async def execute_your_task(task_number: int):
""" Specific task to run in parallel """
# display begin of parallel task in console
print('-> starting parallel task:', task_number)
# sleeping by (randomly: between 1 and 5 seconds) just to see parallism working
seconds_to_sleep = randint(1, 5)
await asyncio.sleep(seconds_to_sleep)
# display end of parallel task in console
print('<- finishing parallel task:', task_number)
# return task information in a dict
return {'task_number': task_number, 'seconds_to_sleep': seconds_to_sleep}
async def running_parallel_tasks():
""" Running 10 parallel tasks - returning parcial results before all tasks to be done """
# define a list with 10 coroutine tasks to be run
tasklist_to_run = []
for n in range(1, 11):
coroutine_of_task = execute_your_task(n)
tasklist_to_run.append(coroutine_of_task)
# run 10 coroutine tasks in parallel but already returning results
task_results = []
for task_coroutine in asyncio.as_completed(tasklist_to_run):
# await coroutine of task to get result
task_result = await task_coroutine
# display result and return
print('! received task result', task_result)
task_results.append(task_result)
return task_results
# Running running_parallel_tasks as asynchronous mode
asyncio.run(running_parallel_tasks())
# Execution example:
"""
In [1]: asyncio.run(running_parallel_tasks())
-> starting parallel task: 10
-> starting parallel task: 8
-> starting parallel task: 5
-> starting parallel task: 9
-> starting parallel task: 2
-> starting parallel task: 6
-> starting parallel task: 7
-> starting parallel task: 1
-> starting parallel task: 3
-> starting parallel task: 4
<- finishing parallel task: 8
<- finishing parallel task: 4
! received task result {'task_number': 8, 'seconds_to_sleep': 1}
! received task result {'task_number': 4, 'seconds_to_sleep': 1}
<- finishing parallel task: 1
! received task result {'task_number': 1, 'seconds_to_sleep': 2}
<- finishing parallel task: 10
<- finishing parallel task: 6
<- finishing parallel task: 7
<- finishing parallel task: 3
! received task result {'task_number': 10, 'seconds_to_sleep': 3}
! received task result {'task_number': 6, 'seconds_to_sleep': 3}
! received task result {'task_number': 7, 'seconds_to_sleep': 3}
! received task result {'task_number': 3, 'seconds_to_sleep': 3}
<- finishing parallel task: 5
<- finishing parallel task: 9
<- finishing parallel task: 2
! received task result {'task_number': 5, 'seconds_to_sleep': 4}
! received task result {'task_number': 9, 'seconds_to_sleep': 4}
! received task result {'task_number': 2, 'seconds_to_sleep': 4}
Out[1]:
[{'task_number': 8, 'seconds_to_sleep': 1},
{'task_number': 4, 'seconds_to_sleep': 1},
{'task_number': 1, 'seconds_to_sleep': 2},
{'task_number': 10, 'seconds_to_sleep': 3},
{'task_number': 6, 'seconds_to_sleep': 3},
{'task_number': 7, 'seconds_to_sleep': 3},
{'task_number': 3, 'seconds_to_sleep': 3},
{'task_number': 5, 'seconds_to_sleep': 4},
{'task_number': 9, 'seconds_to_sleep': 4},
{'task_number': 2, 'seconds_to_sleep': 4}]
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment