2016-08-13 119 views
0

我試圖以特定的速率發送API請求(使用QPS值的示例), 我使用以下代碼啓動我的請求(存儲在web_requests列表中)。發送多個Web請求

如果我設置QPS = 10,延遲將是0.1s或100ms。我使用time.sleep(0.1)併發送一個請求,但是這個代碼正在等待大約30ms的遠端HTTP響應,所以我最終總共有0.3秒的額外延遲。 如何在不等待響應的情況下每秒發送X次Web請求?

@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