Как запланированы потоки (и асинхронные задачи) в Python? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь понять параллелизм в Python и запутался в том, как запланированы потоки и как запланированы задачи (в библиотеке asyncio) для запуска / ожидания.

Предположим, поток пытается получить блокировку изаблокирован.Разве интерпретатор Python немедленно помещает этот поток в очередь «заблокированных»?Как вернуть этот заблокированный поток в рабочее состояние?Есть ли занятое ожидание?

Чем это отличается, когда задача (эквивалент потока) в библиотеке asyncio заблокирована на асинхронном мьютексе?

В чем преимущество asyncio,если в каком-либо из двух вышеупомянутых случаев нет занятого ожидания?

1 Ответ

0 голосов
/ 20 сентября 2019

Предположим, что поток пытается получить блокировку и заблокирован.Разве интерпретатор Python немедленно помещает этот поток в очередь «заблокированных»?

Python создает реальные потоки операционной системы, поэтому интерпретатор не должен выполнять очередей или планирования.

Единственное возможное исключение - глобальная блокировка , используемая интерпретатором для сериализации выполнения кода Python и доступа к объектам Python.Эта блокировка освобождается не только до получения блокировки потока, но и до любой (потенциально) операции блокировки, такой как чтение из дескриптора ввода-вывода или спящего режима.

Что такоеПреимущество asyncio, если в любом из двух вышеупомянутых случаев не используется занятое ожидание?

Преимущество состоит в том, что asyncio не требует нового потока ОС для каждой сопрограммы, которую он выполняет параллельно.Потоки ОС стоят дорого, а асинхронные задачи довольно легки.Кроме того, asyncio делает видимыми потенциальные точки переключения (ключевое слово await), поэтому потенциал расы становится меньше.

Вы можете представить asyncio преемником Twisted , но ссовременный API и использование приостановленных сопрограмм вместо явной цепочки обратных вызовов.

...