Closed dev101 closed 6 years ago
Да, подозрительно выглядит. Странно, что оно раньше никогда не вылезало. На днях погоняю этот кейс.
Обычно если работаешь без прокси и возникает ошибка, то это надолго, и все running
задания заканчиваются onError
(особенно при небольших concurrency). У меня стал зависать скрипт, когда я стал работать через несколько проксей, т.е. запросы в очереди были реально независимы - в одном ошибка, а остальные прекрасно отрабатывают.
onError
вызывается для всех запросов без вариантов, так что setTimeout()
выполнится на последней задаче.icrawler
в принципе не предназначен для работы с несколькими проксями, у которых разные режимы. В частности, если один прокси встанет, то будет постоянно паузиться очередь, а при concurrency
больше количества проксей очередь может встать наглухо.
У меня есть сомнения по поводу того, как работает обработчик ошибок.
Допустим,
concurrency>1
, и какой-то запрос возвращает ошибку. Тогда в строке #140 очередь останавливается, и мы ждём (строка #147), пока отработают остальные активные задания в очереди (которых на момент первой ошибкиconcurrency
штук). И когда останется только одно задание, сработает перезапуск очереди (строка #149).Но дело в том, что перезапуск очереди находится в обработчике
onError
, и если остальные задания отработают успешно (и удалятся из активных), то мы никогда больше не попадём вonError
, чтобы дать возможность выполниться этомуsetTimeout()
.В этой ситуации очередь будет находится на паузе вечно.