@igreklpofrss

Почему код не работает асинхронно?

Хочу перебрать html "карточки" с информацией о товаре. При тестовом запуске что синхрон, что асинхрон - работают одинаковое количество времени. Если добавить сложение x+=1 на каждую итерацию, то она проходит по порядку от 1 до 50(50 карточек). Почему данный код работает синхронно?
import asyncio

def main (cards_list):
    loop = asyncio.new_event_loop() # создаю луп
    tasks = []
    for card in cards_list:
        task = loop.create_task(parse_card(card)) # создаю футуру
        tasks.append(task)
    group = asyncio.gather(*tasks,  loop=loop) # добавляю список футур
    data = loop.run_until_complete(group) # запускаю луп до полного выполнения с возвращением значений
    return data # возвращаю полученные данные


async def parse_card(card):
    d = dict()
    # из карточки берется html
    # "вставляется" в объект супа
    # и возвращается словарь
    # внутри этой функции не используются await
    return d

if '__main__' == __name__:
    cards_list = [...] # тут список карточек в html
    data = main(cards_list) # передаю cards_list в main
    print(data)
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
async def parse_card(card):
    d = dict()
    # из карточки берется html
    # "вставляется" в объект супа
    # и возвращается словарь
    # внутри этой функции не используются await
    return d


Ну а ты что хочешь-то? Асинхронность в питоне предназначена для распараллеливания операций ввода-вывода (и сводимых к ним), а не для параллельного выполнения расчётов. У тебя parse_card() всё равно что синхронная.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ceytnot
Работаю не по специальности (:
Так с первого взгляда у вас нет await перед asyncio.gather и в определении самой функцией main нет async.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы