Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 15, 2019 19:41:01

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

Как asyncio распараллеливает задачи?

Скажите пожалуйста, эвент луп в asyncio, когда обрабатывает асинхронные операции, он их распараллеливает по отдельным потокам или все выполняет в одном потоке?

Например есть следующий код:

 import asyncio
import aiohttp
urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']
async def call_url(url):
    print('Starting {}'.format(url))
    response = await aiohttp.get(url)
    data = await response.text()
    print('{}: {} bytes: {}'.format(url, len(data), data))
    return data
futures = [call_url(url) for url in urls]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))

Я не понимаю что именно происходит по капотом.

В случае javascript всё было бы ясно: использовалось бы api браузера, которое не является частью языка поэтому может все три запроса выполнить в отдельных потоках. А затем вернуть в очередь асинхронных событий первым тот, который готов на 100%.

НО python язык многопоточный и ему не нужна надстройка в виде asyncio чтобы поместить каждый запрос в отдельный поток. Поэтому скорее всего все запросы выполняются в одном потоке. Я не понимаю как

Офлайн

#2 Ноя. 15, 2019 20:47:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как asyncio распараллеливает задачи?

zlodiak
распараллеливает по отдельным потокам или все выполняет в одном потоке
Обычно в одном, но можно сделать и в разных.

https://habr.com/ru/post/421625/
zlodiak
В случае javascript всё было бы ясно:
Вы уверены?
zlodiak
может все три запроса выполнить в отдельных потоках
https://habr.com/ru/company/wrike/blog/302896/
Похоже что JS работает точно также как асинхронный код питона.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version