Comments 6
Создаются все 10M задач (это дёшево, просто корутины)
... Господь, жги!
Такие задачи решаются не через семафоры и 10 миллионов корутин, а через воркеры и очередь заданий
Годная статья, спасибо. Осталось отказаться от "велосипеда" и использовать готовые tenacity/stamina для retry, asyncio.Task.cancelling() для Graceful shutdown))
Классно 👍🏼 Интересно, а если попробовать Locust в распределённом режиме, то какие результаты получим 🤔
В aiohttp, по умолчанию лимит 100 соединений, поэтому сразу все запросы не отправятся.
Вместо пакета signal, есть нативная обработка сигналов.
https://docs.python.org/3/library/asyncio-eventloop.html#set-signal-handlers-for-sigint-and-sigterm
def canceled_tasks():
# завершение задач, освобождение ресурсов
...
loop.add_signal_handler(signal.SIGINT, canceled_tasks)Ну 50 потоков можно и в тредах запускать. В python 3.14 появились саб-интерпретаторы, которые спускают GIL на уровень потока, а не всего процесса. Так что InterpreterPoolExecutor(max_workers=50) будет делать примерно то же самое.
Как не положить API: rate limiting в Python