astur / icrawler

Tool for easy scraping data from websites
MIT License
12 stars 4 forks source link

Queue never restarted #2

Closed dev101 closed 6 years ago

dev101 commented 6 years ago

У меня есть сомнения по поводу того, как работает обработчик ошибок.

image

Допустим, concurrency>1, и какой-то запрос возвращает ошибку. Тогда в строке #140 очередь останавливается, и мы ждём (строка #147), пока отработают остальные активные задания в очереди (которых на момент первой ошибки concurrency штук). И когда останется только одно задание, сработает перезапуск очереди (строка #149).

Но дело в том, что перезапуск очереди находится в обработчике onError, и если остальные задания отработают успешно (и удалятся из активных), то мы никогда больше не попадём в onError, чтобы дать возможность выполниться этому setTimeout().

В этой ситуации очередь будет находится на паузе вечно.

astur commented 6 years ago

Да, подозрительно выглядит. Странно, что оно раньше никогда не вылезало. На днях погоняю этот кейс.

dev101 commented 6 years ago

Обычно если работаешь без прокси и возникает ошибка, то это надолго, и все running задания заканчиваются onError (особенно при небольших concurrency). У меня стал зависать скрипт, когда я стал работать через несколько проксей, т.е. запросы в очереди были реально независимы - в одном ошибка, а остальные прекрасно отрабатывают.

astur commented 6 years ago
  1. когда очередь уже на паузе onError вызывается для всех запросов без вариантов, так что setTimeout() выполнится на последней задаче.
  2. icrawler в принципе не предназначен для работы с несколькими проксями, у которых разные режимы. В частности, если один прокси встанет, то будет постоянно паузиться очередь, а при concurrency больше количества проксей очередь может встать наглухо.