【Tornado】协程队列和异步DNS解析器在Tornado项目里的实战表现已经运用详解

2022-12-13 18:31:36 浏览数 (1)

协程队列

从队列中删除项目并将其返回。 返回可等待项目龙卷风。util在项目可用或引发after TimeoutError超时后解析。 超时可以是一个表示时间的数字(使用tornado.ioloop.ioloop.time,通常是time.time)datetime timedelta对象用于相对于当前时间的截止时间。指示先前排队的任务已完成。

代码语言:javascript复制
from tornado.queues import PriorityQueue

q = PriorityQueue()
q.put((1, 'medium-priority item'))
q.put((0, 'high-priority item'))
q.put((10, 'low-priority item'))

print(q.get_nowait())
print(q.get_nowait())
print(q.get_nowait())

由队列使用者使用。每个get用于获取任务,然后调用该任务,done告诉队列任务的处理已完成。 如果A联接被阻止,则在处理完所有项目后将恢复;也就是说,当put匹配任务A_完成时。 加薪ValueError如果通话次数超过

代码语言:javascript复制
from tornado.queues import LifoQueue

q = LifoQueue()
q.put(3)
q.put(2)
q.put(1)

print(q.get_nowait())
print(q.get_nowait())
print(q.get_nowait())

如果num_如果进程不存在或<=0,我们将检查此计算机上可用的内核数并复制子进程数。如果给定num_进程并且大于0,我们将派生特定数量的子进程。 因为我们使用进程而不是线程,所以任何服务器代码之间都没有共享内存。 请注意,如果使用多个进程,并且使用了自动加载模块(或autoreload=True选项tornador.web.Application,当debug=True时),则分叉被称为进程。

在每个子进程中,fork_Processs返回其任务ID,一个介于0和num_Processs之间的数字。异常退出的进程(由于信号或非零退出状态)使用相同的ID(最多max_restarts时间)。在父进程中,fork_ProcessesPhone-sys。exit(0)所有子进程正常退出后。 默认情况下,最大重新启动次数为100。

代码语言:javascript复制
def simple_app(environ, start_response):
    status = "200 OK"
    response_headers = [("Content-type", "text/plain")]
    start_response(status, response_headers)
    return [b"Hello world!n"]

container = tornado.wsgi.WSGIContainer(simple_app)
http_server = tornado.httpserver.HTTPServer(container)
http_server.listen(8888)
tornado.ioloop.IOLoop.current().start()

包子流程。Popen支持iostream。 构造函数和子流程。Popen添加以下内容: Stdin、stdout和stderr的值可能为tornado.process.Subprocess.STREAM,这将生成生成的子流程的相应属性PipeIOStream。如果使用此选项,则调用方负责在使用流时关闭该流。 此Subprocess.STREAM选项和选项set_exit_Callback and wait_for_exit方法不适用于Windows。因此,没有理由在该平台上使用该类替换subprocess.Popen。

异步DNS解析器

C-ARES。 这是一个非阻塞和非线程解析器。它可能不会产生与系统解析器相同的结果,但当线程不可用时,它可以用于非阻塞解析。 当系列为AF_ UNSPEC时,C-ARES无法解析某些名称,因此建议仅用于AF_ INET(即IPv4)。这是默认的龙卷风simple_Httpclient,但其他库可能默认为AF_UNSPEC。 6.2版之后删除:此类型已被丢弃,并将在Tornado 7.0中删除。请改用默认的基于线程的解析器。

AsyncIOLoop是在异步事件循环中运行的IOLoop。该类遵循通常的Tornado语义来创建新的IOLoops;这些循环不一定是异步的默认事件循环。 每个AsyncIOLoop创建一个新的异步EventLoop您可以使用asyncio_Loop属性。

代码语言:javascript复制
from tornado import gen
from tornado.ioloop import IOLoop
from tornado.locks import Condition

condition = Condition()

async def waiter():
    print("I'll wait right here")
    await condition.wait()
    print("I'm done waiting")

async def notifier():
    print("About to notify")
    condition.notify()
    print("Done notifying")

async def runner():
    # Wait for waiter() and notifier() in parallel
    await gen.multi([waiter(), notifier()])

IOLoop.current().run_sync(runner)

此类的一个实例启动第二个线程来运行选择器。此线程对用户完全隐藏;所有回调都在包装的事件循环的线程上运行。 Tornado自动使用此类;应用程序不需要直接引用它。 使用此类包装任何事件循环都是安全的,即使它只实现add_读取器方法家族本身(即.WindowsProactorEventLoop) 关闭AddThreadSelecterEventLoop和包装的事件循环。

协程的异步队列。这些类与标准库的asyncio包中提供的类非常相似。 小心: 与标准库的队列模块不同,这里定义的类不是线程安全的。要从另一个线程使用这些队列,请使用IOLoop add_ Callback将控制权转移到IOLoop线程。

代码语言:javascript复制
def consumer():
    while True:
        item = yield q.get()
        try:
            print('Doing work on %s' % item)
            yield gen.sleep(0.01)
        finally:
            q.task_done()

在队列中放入一个项目,也许直到有空间为止。 返回一个Future,它将抛出tornado.util。超时后出现超时错误。 超时可以是表示时间的数字(与tornado.ioloop.ioloop.time的比例相同,通常是time.time),也可以是相对于当前时间Timedelta对象的结束日期的日期时间。 如果num_ If processs为None或<=0,我们将检测此计算机上可用内核的数量,并导出此数量的子进程。如果num为进程数且大于0,我们将分叉特定数量的子进程。 由于我们使用进程而不是线程,所以任何服务器代码之间都没有共享内存。 请注意,多个进程与autoreload模块(或tornado.web.Application的autoreload=True选项,当debug=True时默认为True)不兼容。当使用多个进程时,调用fork_不能在进程之前创建或引用IOLoop。

代码语言:javascript复制
ret = yield proc.wait_for_exit()

0 人点赞