Подкрадываясь к асинхронному, многопоточному и параллельному коду нужно сначала изучить основы и понять используемые термины.
Конкурентность (concurrency) - запуск на выполнение сразу нескольких задач (не обязательно в 1 момент времени выполняется несколько). Зависит от ПО. Первые ОС с процессором без ядер -использовали только ее.
Параллельность (parallel) - конкурентность, когда 2 задачи выполняются одновременно. Зависит от железа. Вы не можете одновременно (!) выполнять больше задач, чем есть ядер в системе.
GIL (Global Interpreter Lock) - глобальная блокировка интерпретатора, механизм гарантирующий, что в любой момент времени выполняется только 1 инструкция в питоне.
Задачи для Python могут быть:
CPU-bound - зависит от мощности процессора
IO-bound - зависит от системы ввода/вывода
threading - IO-bound задачи
asyncio - IO-bound задачи
multiprocessing - любые задачи
Читать!
Фаулер М. “Asyncio и конкурентное программирование на Python&quo