2017-02-22 43 views
1

В настоящее время моя структура составляет Flask, Redis, RabbitMQ and Celery. В моих выскабливаниях я использую requests и BeautifulSoup. Моя колба работает на apache и wsgi. Это на prod. С app.run(threaded=True)Скребковый сайт с использованием сельдерея

У меня есть 25 API. 10 - очистить URL-адрес, например заголовки и т. Д., А остальное - использовать сторонний API для этого URL-адреса.

Я использую аккорд для обработки моих API-интерфейсов и получения данных из API-интерфейсов с использованием requests.

Для моего заголовка аккорда у меня есть 3 рабочих, в то время как на моем обратном вызов У меня есть только 1. Я имею проблему узкого места наличия ConnectTimeoutError и MaxRetryError. Когда я прочитал какой-то поток, он сказал сделать тайм-аут для каждого процесса, потому что эта ошибка означает, что вы перегружаете удаленный сервер.

Проблема в том, что я использую аккорд, нет смысла использовать время сна, так как вызов 25 API будет выполняться одновременно. Кто-нибудь столкнулся с этим? Или я делаю это неправильно?

Поток, который я читаю, кажется, говорит, чтобы изменить запросы на pycurl или использовать Scrapy. Но я не думаю, что это так, поскольку ConnectTimeoutError касается моего хоста, перегружающего определенный сервер URL.

Мой процесс аккорд:

callback = create_document.s(url, company_logo, api_list) 
header = [api_request.s(key) for key in api_list.keys()] 
result = chord(header)(callback) 

В api_request запросов задач используется.

ответ

0

Если вы хотите ограничить количество выполняемых одновременно скрепок, вы можете создать задачу enqueue, которая проверяет, работает ли другая задача, которая имеет те же свойства, что и задание, которое вы хотите запустить. Если задача запущена, вы попросите ее спать в течение нескольких секунд и снова проверьте. Когда он видит, что один из них не запущен, вы можете поставить очередь на задание, которое вы хотите запустить. Это позволит вам спать с асинхронными задачами. Вы даже можете считать задачи и запускать больше, если работает только определенное число. При этом вы можете запустить 5 в то время, и посмотреть, если он душил достаточно, то в очереди другой, когда вы видите один закончил и т.д.

:: EDIT ::

Documentation for Celery Inspect

+0

У вас есть ссылка документацию или образец кода? – Bazinga

+0

Я добавил ссылку для вас. –