当前位置: 首页 > 知识库问答 >
问题:

龙卷风一般睡眠增加延迟

贲俊才
2023-03-14

我试图以异步方式在请求之间添加延迟。当我使用龙卷风gen.sleep(x)时,我的函数(启动)不会执行。如果我从产量gen.sleep(1.0)中删除产量,函数被调用,但没有添加延迟。如何在我的for循环中添加请求之间的延迟?我需要控制请求每秒外部API。如果使用time.sleep所有请求完成后,响应将延迟。尝试添加@gen.engine装饰器启动功能,但没有结果。

代码:

import collections
import tornado.httpclient


class BacklogClient(object):
    MAX_CONCURRENT_REQUESTS = 20

    def __init__(self, ioloop):
        self.ioloop = ioloop
        self.client = tornado.httpclient.AsyncHTTPClient(max_clients=self.MAX_CONCURRENT_REQUESTS)
        self.client.configure(None, defaults=dict(connect_timeout=20, request_timeout=30))
        self.backlog = collections.deque()
        self.concurrent_requests = 0

    def __get_callback(self, function):
        def wrapped(*args, **kwargs):
            self.concurrent_requests -= 1
            self.try_run_request()
            return function(*args, **kwargs)

        return wrapped

    def try_run_request(self):
        while self.backlog and self.concurrent_requests < self.MAX_CONCURRENT_REQUESTS:
            request, callback = self.backlog.popleft()
            self.client.fetch(request, callback=callback)
            self.concurrent_requests += 1

    def fetch(self, request, callback=None):
        wrapped = self.__get_callback(callback)

        self.backlog.append((request, wrapped))
        self.try_run_request()


import time
from tornado import ioloop, httpclient, gen


class TornadoBacklog:
    def __init__(self):

        self.queue = 0
        self.debug = 1
        self.toProcess = [
            'http://google.com',
            'http://yahoo.com',
            'http://nytimes.com',
            'http://msn.com',
            'http://cnn.com',
            'http://twitter.com',
            'http://facebook.com',
        ]


    def handle_request(self, response):

        print response.code
        if not self.backlog.backlog and self.backlog.concurrent_requests == 0:
            ioloop.IOLoop.instance().stop()


    def launch(self):
        self.ioloop = ioloop.IOLoop.current()
        self.backlog = BacklogClient(self.ioloop)

        for item in self.toProcess:
            yield gen.sleep(1.0)
            print item
            self.backlog.fetch(
                httpclient.HTTPRequest(
                    item,
                    method='GET',
                    headers=None,
                ),
                self.handle_request
            )

        self.ioloop.start()



def main():
    start_time = time.time()

    scraper = TornadoBacklog()
    scraper.launch()

    elapsed_time = time.time() - start_time
    print('Process took %f seconds processed %d items.' % (elapsed_time, len(scraper.toProcess)))


if __name__ == "__main__":
    main()

参考:https://github.com/tornadoweb/tornado/issues/1400

共有1个答案

贺浩壤
2023-03-14

Tornado协同程序有两个组件

  1. 它们包含“收益率”声明

在您的"启动"功能上使用"协程"装饰器:

@gen.coroutine
def launch(self):

从头到尾运行龙卷风协同路线,如下所示:

tornado.ioloop.IOLoop.current().run_sync(launch)

从你的“启动”函数中删除对“ioloop.start”的调用:循环运行“启动”函数,反之亦然。

 类似资料:
  • 我已经建立一个网站一段时间了,我仍然坚持那件事: 我在dbm数据库中为我的网站存储了一些小视频(最多大约400MB),我想在我的网站上播放它们。 我正在使用Tornado python框架手工构建请求处理程序,我想知道如何构建我的处理程序。我从未发现媒体流是如何工作的,也没有在网上找到很多话题。 所以我想要实现的完整结果是在我的网站上有一个网络播放器,在那里我可以请求特定的视频,然后播放它们,而不

  • 如何获得我的python龙卷风模块版本的当前版本? 与其他软件包,我可以做到以下几点: 来源:如何检查python模块的版本?

  • 问题内容: 我想使用python库龙卷风(版本4.2)进行一些异步HTTP请求。但是,由于出现异常:我无法强迫将来完成(使用),因为“ DummyFuture不支持阻止结果”。 我有python 3.4.3,因此将来的支持应该成为标准库的一部分。的文档说: 如果有龙卷风,将使用。否则,它将使用此模块中定义的兼容类。 下面提供了我尝试做的一个最小示例: 如果我正确理解我的问题,则会发生此问题,因为未

  • 问题内容: 我有一个基本的Tornado websocket测试: 我希望能够处理多个连接(似乎已经做到了),而且还能够引用其他连接。我没有一种方法来识别和跟踪单个连接,只是为了能够处理打开连接,接收消息和关闭连接时的事件。 [编辑] 想创建一个dict,其中键是Sec-websocket-key,值是WSHandler对象…。我不确定Sec-websocket-key的可靠性如何。 问题答案:

  • 问题内容: 请帮助我创建HTTPS龙卷风服务器我当前的代码Python3不起作用 HTTPS对我来说很重要,请帮忙 问题答案: 无需使用。 请尝试以下操作:

  • 我见过龙卷风文档和示例,其中self.write方法被广泛用于在超文本标记语言上呈现一些值,其中POST请求在处理程序中运行。但是我找不到关于如何将响应返回给客户的清晰信息。 例如,我正在从我的客户端调用Tornado服务器上的POST请求。接受post请求的代码为: 有了这个,我可以找到cbtp的值,有了,我可以用HTML打印它。但是,相反,我想以JSON格式将这个值返回给客户机,比如我想知道如