Загрузка...

Чисто на интерес вопрос

Тема в разделе Python создана пользователем Stalkie 28 июл 2025 в 18:12. 56 просмотров

  1. Stalkie
    Stalkie Автор темы 28 июл 2025 в 18:12 102 8 апр 2017
    Те кто давно работает в асинхронным кодом, как вы решаете задачу, когда синхронная функция сама по себе не блокирует поток (не ждёт открытия файла или ответа от бд), но при этом обрабатывает какой то огромный массив, что мешает ивент лупу переключится, пока весь массив не будет обработан? Используете ли вы явную передачу управления ивент лупу на каждой итерации?
     
  2. MALWARE
    MALWARE 28 июл 2025 в 18:24 мяукаю 12 012 12 мар 2021
    наверн проще всего раз в 100 операций делать вот так:
    Python
    import asyncio

    async def process_large_array(data):
    result = []
    for i, item in enumerate(data):
    # Тяжелая синхронная обработка
    processed = heavy_sync_operation(item)
    result.append(processed)

    if i % 100 == 0:
    await asyncio.sleep(0)

    return result
    --- Сообщение объединено с предыдущим 28 июл 2025 в 18:25
    или отдельный поток

    Python
    async def process_chunk_in_thread(chunk):
    return await asyncio.to_thread(heavy_sync_processing, chunk)

    async def process_large_array(data):
    chunk_size = 1000
    chunks = [data[i:i+chunk_size] for i in range(0, len(data), chunk_size)]

    tasks = [process_chunk_in_thread(chunk) for chunk in chunks]
    results = await asyncio.gather(*tasks)

    return [item for sublist in results for item in sublist]
     
    1. Stalkie Автор темы
      MALWARE, первый варик выглядит как костыль, разве нет более явного способа передать управление ивент лупу? я понимаю в чём смысл, но уж слишком костыльно выглядит.
    2. Stalkie Автор темы
      MALWARE, было бы логичнее добавить asyncio.yield() который просто возвращал бы управление в ивент луп и становился в конец очереди. странно что до сих пор все юзают asyncio.sleep(0), читая код мимолётом, если не знать об этом костыле, придётся на пару секунд задержаться что бы обдумать зачем код спит 0 секунд.
Загрузка...
Top