Почему я не могу использовать concurrent.futures в цикле событий asyncio?

В документации asyncio говорится, что asyncio имеет:

«класс Future, имитирующий класс в модуле concurrent.futures, но адаптированный для использования с циклом событий»;

Почему необходимо иметь два разных класса Future в стандартной библиотеке (в asyncio и в параллельном)? И почему его нужно адаптировать под цикл событий? Что мне здесь не хватает, или что заставило их так решить?


person Marcelo Duarte Fernandes    schedule 10.09.2017    source источник


Ответы (1)


Почему необходимо иметь два разных класса Future в стандартной библиотеке (в asyncio и в параллельном)?

Хотя эти классы похожи, они используются для двух разных парадигм параллельного программирования и имеют разные реализации и интерфейсы. Например,

concurrent.futures.Future используется для параллельного программирования на основе потоков / процессов и не должен ничего знать о цикле событий, потому что в этом случае его нет. Этот метод result просто блокирует поток выполнения потока / процесса до истечения тайм-аута или будущего времени.

asyncio.Future используется для параллельного программирования на основе сопрограмм и должен знать о циклах событий, функциях сопрограмм и других связанных вещах. Этот метод result не будет блокировать поток выполнения, поскольку в этом случае поток выполнения не должен быть блокирован вообще. Вместо этого вам следует дождаться будущего, пока оно не будет выполнено, чтобы поток выполнения мог быть возвращен и управлялся циклом событий.

Их смешивание не дает никаких преимуществ, в то время как разделение классов упрощает их реализацию и упрощает интерфейсы.

person Mikhail Gerasimov    schedule 10.09.2017
comment
Подробнее stackoverflow.com/questions/43882301/ и stackoverflow.com/questions/29902908/ - person kwarunek; 10.09.2017