【Tornado】协程队列和异步DNS解析器在Tornado项目里的实战表现已经运用详解
协程队列
从队列中删除项目并将其返回。
返回可等待项目龙卷风。util在项目可用或引发after TimeoutError超时后解析。
超时可以是一个表示时间的数字(使用tornado.ioloop.ioloop.time,通常是time.time)datetime timedelta对象用于相对于当前时间的截止时间。指示先前排队的任务已完成。
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如果通话次数超过
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。
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属性。
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线程。
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。
ret = yield proc.wait_for_exit()
- 点赞
- 收藏
- 关注作者
评论(0)