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