Загрузка...

Purely question question

Thread in Python created by Stalkie Jul 28, 2025 at 6:12 PM. 58 views

  1. Stalkie
    Stalkie Topic starter Jul 28, 2025 at 6:12 PM 102 Apr 8, 2017
    Те кто давно работает в асинхронным кодом, как вы решаете задачу, когда синхронная функция сама по себе не блокирует поток (не ждёт открытия файла или ответа от бд), но при этом обрабатывает какой то огромный массив, что мешает ивент лупу переключится, пока весь массив не будет обработан? Используете ли вы явную передачу управления ивент лупу на каждой итерации?
     
  2. MALWARE
    MALWARE Jul 28, 2025 at 6:24 PM мяукаю 12,012 Mar 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
    The post was merged to previous Jul 28, 2025 at 6:25 PM
    или отдельный поток

    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 Topic starter
      MALWARE, первый варик выглядит как костыль, разве нет более явного способа передать управление ивент лупу? я понимаю в чём смысл, но уж слишком костыльно выглядит.
    2. Stalkie Topic starter
      MALWARE, было бы логичнее добавить asyncio.yield() который просто возвращал бы управление в ивент луп и становился в конец очереди. странно что до сих пор все юзают asyncio.sleep(0), читая код мимолётом, если не знать об этом костыле, придётся на пару секунд задержаться что бы обдумать зачем код спит 0 секунд.
Loading...
Top