2016-08-13 4 views
0

Я пытаюсь отправить запросы API с определенной скоростью (пример с использованием значения QPS), Я использую следующий код для запуска моих запросов (хранящихся в списке web_requests).Отправить несколько веб-запросов

Если я установил QPS = 10, задержка составит 0,1 с или 100 мс. Я использую time.sleep (0.1) и отправляю запрос, но этот код ожидает ответа HTTP удаленного конца, который составляет около 30 мс, поэтому я получаю 0,3 секунды дополнительной задержки. Как я могу отправить X веб-запросов в секундах, не дожидаясь ответа?

@gen.coroutine 
def send_requests(campaign_instance): 
    ... 
    http_client = httpclient.AsyncHTTPClient() 
    while True: 
       try:       
        web_request = web_requests.pop() 
        time.sleep(delay) 
        headers = {'Content-Type': 'application/json'} 
        request = httpclient.HTTPRequest(auth_username=settings.api_account, 
                auth_password=settings.api_password, 
                url=settings.api_web_request, 
                body=json.dumps(web_request), 
                headers=headers, 
                request_timeout=5, 
                method="POST") 
        yield http_client.fetch(request, callback=partial(handle_response, web_request["to"])) 

        gen_log.info("start_campaign() Requests in Queue: {}".format(len(web_requests))) 

       except httpclient.HTTPError, exception: 
        gen_log.info.exception("start_campaign() ".format(exception)) 
        api_errors += 1 
        if handle_api_errors(api_errors): 
         break 
       except IndexError: 
        gen_log.info.info('start_campaign() Campaign web requests completed. API Errors: {}'.format(api_errors)) 
        break 

def start(): 
    ioloop.IOLoop.current().run_sync(lambda: send_requests(campaign_instance)) 
    log.info('process_campaign() Campaign completed') 
    campaign_instance.terminate() 

ответ

1

Просто не «отдавайте» будущее, возвращенное «извлечения». Затем ваша сопрограмма продолжит цикл сразу, и обратный вызов выполняется, когда выборка завершается в фоновом режиме.

Кроме того, никогда не когда-либо называют «сон» в приложении Торнадо:

http://www.tornadoweb.org/en/stable/faq.html#why-isn-t-this-example-with-time-sleep-running-in-parallel

Если вы это сделаете, все остановки обработки и ваш «выборки» подвешен до завершения сна. Вместо этого:

yield gen.sleep(delay) 
+0

Работал после вашего совета. благодаря – spicyramen

Смежные вопросы