sleep можно вызывать - из рабочего потока.
А еще можно смотреть в сторону reactor.callLater
tasks =
def start_next():
func, params = tasks.pop()
cb = deferToThread(func, *params)
cb.addCallback(lambda _:reactor.callLater(1, start_next))
van-gogИспользуй меньше потоков :-).
ато сервер сильно грузит
van-gogОбъясни почему является проблемой делать жто из главного потока? Насколько я помню поток не будет блокирован на все время скачки, реактор продолжит работать и продролжит выполнять параллельную (в главном же потоке) работы с сокетами и отложенными вызовами. Единственная проблема, это то что система будет мене отзывчива, тормазнута что-ли, хотя это не всегда проблема. Выгрышь - большая скорость загрузки, простота приложения, надежность (потенциально меньше ошибок).
На скачку одной страницы уходит приблизительно 6-10 секунд.
Андрей СветловТ.е. Больше 10 клиентов одновременно работать не смогут?
реактор уже содержит пул потоков. С максимальным размером именно в 10 штук.
Поэтому просто бомби threads.deferToThread сколько хочешь раз. Больше десяти одновременно выполняться не будет.
Андрей СветловНе спорю, что твистед только асинхронно и неблокирующе работает в основном, но…
Клиентов может быть сколько угодно.
Андрей СветловТо что есть такой способ это отлично. Количество потоков и правда велико.
reactor.suggestThreadPoolSize(10000)
Но даже десять тысяч - это сильно жестоко.
bwДа похоже перемудрил. Просто думал, что поскольку длительность выполнения задачи в потоке(из пула потоков) намного больше чем период между последовательными выборками из сокета, то при постоянном количестве потоков, либо должен накапливаться список необработанных запросов либо будет ограничение на количество открытых сокетов(подключений), которым требуется свободный поток для выполнения запроса.