Pull to refresh

Comments 6

Создаются все 10M задач (это дёшево, просто корутины)

... Господь, жги!

Такие задачи решаются не через семафоры и 10 миллионов корутин, а через воркеры и очередь заданий

Согласен! Producer-Consumer — правильное решение (код в P.S. секции). Но статья про семафор как инструмент rate limiting. Показал путь от gather → semaphore → queue, чтобы понятно было зачем каждый шаг. 10M корутин — для демонстрации проблемы

Годная статья, спасибо. Осталось отказаться от "велосипеда" и использовать готовые 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) будет делать примерно то же самое.

Sign up to leave a comment.

Articles