Многопоточность vs асинхронность?
===================================

 Доброго времени суток... Хотелось бы узнать разницу между этими подходами. Разве асинхронное программирование не подразумевает из себя похожее на многопоточность? Когда задачи выполняются в одном потоке? 

 Различия в подходах работы соответствующих методов, чья работа должна выполняться долго и чего то ждать (например сетевое взаимодействие но не обязательно само собой).  

  

Синхронное выполнение - это значит все ваши методы, выполняющие какую то задачу работают до тех пор пока эта задача не завершится, например отправка данных в сеть, запись на диск (с оговорками, существует режим записи файлов, при котором запись данных в файл происходит в буфер в памяти, а реальная запись происходит параллельно потом). В этом способе невозможно запустить два одновременных метода, например запись на диск и чтение из сети - что очень неэффективно расходует ресурсы, так как пока тут идет запись на диск - сеть не нагружена и наоборот.  

  

Асинхронное выполнение - это значит вызов начала действия завершается в тот же миг как был вызван, запуская процесс загрузки каким-либо способом (зачастую в другом потоке но не обязательно) и дает вам какие то инструменты получения информации о том, завершилась ли работа или нет, например callback методы, которые вызываются по завершению работы или ошибки, в параметрах которых будет выдан результат (либо для его получения будут другие методы). Т.е. вы можете запустить несколько асинхронных действий одновременно, эффективно расходуя ресурсы.  

  

Многопоточное - в разрезе выше описанной задачи, это подход запуска одновременно нескольких синхронных методов, которые готовы к такому запуску (эта оговорка требует примечаний километра на два текста) в отдельных потоках (треды и/или процессы) - специальных сущностях операционной системы, работающих независимо и одновременно (точнее псевдоодновременно, к примеру у вас 16 ядер процессора а у вас 100 одновременно работающих потоков, чтобы они работали одновременно система сама периодически перекидывает активные потоки между ядрами на короткое время - миллисекунды, замораживая остальные, создавая иллюзию одновременной работы), таким образом ваши методы работают одновременно, но приходится тратить силы на синхронизацию. 

 Если без нюансов:  

Многопоточность - переключение между задачами выполняет python, надо понимать что такое GIL и release GIL.  

Асинхронность - один поток - event loop, задача "сама сигнализирует" что она "выполнена" (ну или с натяжкой, программист "управляет" переключением), основная проблема - задача должна быть неблокирующей, иначе всё сводится к выполнения синхронного кода в одном потоке. 

 Многопоточность vs асинхронность  

  

Ресторан. Клиент заказал яичницу и гренки.   

  

1. Синхронное выполнение: даем задание 1 повару. Он сначала делает яичницу. После того как она готова он приступает к гренкам.  

  

2. Асинхронное выполнение (многопоточность): даем задание 2 поварам. Они приступают условно одновременно. Один делает яичницу, второй гренки и оба конфликтуют из-за доступа к общим ресурсам (перцу, соли, сковородке).  

  

3. Асинхронное выполнение (1 поток): даем задание 1 повару. Он ставит на плиту яичницу и ставит таймер. Ставит гренки и тоже ставит таймер. Пока таймеры не сработали, чтобы не терять время, прибирает кухню. После того как сработают оба таймера - отдает заказ.