Обновить

Комментарии 9

GIL отпускается в io баунд задачах.

Операционная система как обычно переключает потоки и все задачи таки выполняются.

С той разницей, что async код сам говорит, что он отпускает поток выполнения, а операционная система приходит раз 5 милисекунд.

Ну и потоки больше потребляют памяти, сильно много их не запустишь, а корутин можно запустить тысячи, десятки тысяч.

Спасибо, добавлю это в статью.

Вот здесь можно посмотреть в разделе "Сравнение скорости работы" разницу между threading и asyncio

О, спасибо, гляну

Очень круто, спасибо! Сохранил в закладках

Спасибо за статью, освежил знания

чебупели

Спасибо за статью, узнал что-то новое.

GIL ... это фигня, которая позволяет за раз выполняться только 1 потоку. Это сделано для того, чтобы несколько потоков не пытались одновременно изменить одни и те же данные.

GIL сериализует доступ к интерпретатору, а не данным как таковам. Сам по себе GIL не мешает потокам выполняться одновременно и изменять одни и те же значения (чтобы этого не допускать приходится использовать примитивы синхронизации). Async в этом смысле тоже ни чего не решает. Зато он даёт возможность наступить на те же грабли даже в рамках одного потока.

Полезность async с самого начала была сильно переоценина. Это не причина отказываться, просто повод хорошо подумать - правда-ли оно вам нужно. Обычный синхронный код гораздо проще отлаживать и поддерживать. Делать обработку тысяч соединений в один поток - идея в любом случае так себе.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации