Достигнут предел max_clients, запрос торнадо в очереди

Я использую python для отправки нескольких HTTP-запросов. > 1000 запросов запускаются асинхронно одновременно. Но я получаю сообщение об ошибке: достигнут лимит max_clients, запрос торнадо в очереди и через некоторое время я получаю сообщение об ошибке тайм-аута.

Как вы решаете такие проблемы, отправляя несколько HTTP-запросов и избегая тайм-аута?

Вот код, который я использую:

class AjaxBatchHandler(basehandler.BaseHandler):
    @tornado.gen.coroutine
    def post(self):
        # just respond with a status, no redirect to login
        if not self.get_current_user:
            self.set_status(403)

        batch = json.loads(self.get_argument("actions").encode('utf-8'))

        client = tornado.httpclient.AsyncHTTPClient()

        batch_requests = []
        for item in batch['actions']:
            request = utils.build_request(
                self,
                action=item['action'].replace("{API}", utils.get_api_baseurl()),
                values=item['values'])
            batch_requests.append(client.fetch(request))

        try:
            batch_responses = yield batch_requests

            batch_result = dict(results=[])
            for result in batch_responses:
                batch_result['results'].append(json.loads(result.body))

        except tornado.httpclient.HTTPError as e:
            batch_result = dict(results=[])
            batch_result['results'].append({"Status": 500,
                                        "StatusMsg": e.message,
                                        "Error": e.code
                                        })

        self.write(batch_result)

person Monicka    schedule 29.10.2015    source источник


Ответы (1)


Либо увеличьте лимит max_clients (если вам удобно отправлять больше трафика на посещаемый вами сайт), либо замедлите свои запросы. Для первого сделайте

AsyncHTTPClient.configure(None, max_clients=1000)

в начале вашей программы. В последнем случае либо семафор, либо очередь могут быть полезны для управления скоростью, с которой вы отправляете запросы. См. https://github.com/tornadoweb/tornado/blob/master/demos/webspider/webspider.py

person Ben Darnell    schedule 29.10.2015
comment
отправив сразу много асинхронных вызовов, например, под большим количеством я имею в виду 10 000, чем увеличение max_clients не решит проблему. Но я присмотрюсь к очередям. Однако я решил проблему на данный момент. Я отправляю каждый вызов асинхронно, используя вызовы ajax, и собираю ответы, когда все ответы есть, я показываю результат. Я заметил, что это более медленный процесс, но работает без тайм-аута. - person Monicka; 30.10.2015