iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >tornado6与python3.7
  • 169
分享到

tornado6与python3.7

2023-01-31 08:01:05 169人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

__auth__ = "aleimu" __doc__ = "学习tornado6.0+ 版本与python3.7+" import time import asyncio import tornado.gen import torn

__auth__ = "aleimu"
__doc__ = "学习tornado6.0+ 版本与python3.7+"

import time
import asyncio
import tornado.gen
import tornado.WEB
import tornado.ioloop
import tornado.httpserver  # tornado的Http服务器实现
from tornado.options import define, options
from tornado.httpclient import HTTPClient, AsyncHTTPClient
from requests import get

settings = {'debug': True}
url = "http://127.0.0.1:5000/"  # 这是另个服务,请求5s后返回结果


# RuntimeError: Cannot run the event loop while another loop is running
# 解释:HTTPClient内部写 loop.run_xxx,因为那是启动event loop的命令,通常只再最最最外面用一次,之后的代码都应假设 loop 已经在运转了。
def synchronous_fetch(url):
    print("synchronous_fetch")
    try:
        http_client = HTTPClient()
        time.sleep(5)
        response = http_client.fetch(url)
        print(response.body)
    except Exception as e:
        print("Error: " + str(e))
        return str(e)
    http_client.close()
    return response.body


# 替代synchronous_fetch的同步请求,没有内置loop.run_xxx
def synchronous_get(url):
    response = get(url)
    time.sleep(5)
    print("synchronous_fetch")
    return response.text


# 简单的模拟异步操作,这里之后应该替换成各种异步库的函数
async def sleep():
    print("start sleep")
    await asyncio.sleep(5)
    print("end sleep")


# 异步请求
async def asynchronous_fetch(url):
    http_client = AsyncHTTPClient()
    response = await http_client.fetch(url)
    print("asynchronous_fetch")
    return response.body


# 测试
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world:%s" % self.request.request_time())
        self.finish()
        print("not finish!")
        return


# 同步阻塞
class synchronous_fetcher(tornado.web.RequestHandler):
    def get(self):
        self.write("%s,%s" % (synchronous_fetch(url), self.request.request_time()))


# 同步阻塞
class synchronous_geter(tornado.web.RequestHandler):
    def get(self):
        self.write("%s,%s" % (synchronous_get(url), self.request.request_time()))


# 异步阻塞,我以为curl "127.0.0.1:8888/1" 总耗时希望为5s,可是是25s,看来异步没搞好,以下的函数都是基于此改进的
class asynchronous_fetcher_1(tornado.web.RequestHandler):
    async def get(self):
        body = await asynchronous_fetch(url)
        for i in range(3):
            print("skip %s" % i)
            await tornado.gen.sleep(5)
        time.sleep(5)
        print("end request")
        self.write("%s,%s" % (body, self.request.request_time()))

# curl "127.0.0.1:8888/1"
# b'{\n  "data": "123"\n}\n',25.026000022888184


# 异步阻塞,效果同上,这里只是证明 tornado.gen.sleep(5)和asyncio.sleep(5) 效果一致
class asynchronous_fetcher_2(tornado.web.RequestHandler):
    async def get(self):
        body = await asynchronous_fetch(url)  # 关注协程完成后返回的结果
        for i in range(3):
            print("skip %s" % i)
            await sleep()
        time.sleep(5)
        print("end request")
        self.write("%s,%s" % (body, self.request.request_time()))

# curl "127.0.0.1:8888/2"
# b'{\n  "data": "123"\n}\n',25.039999961853027


# 异步非阻塞-将部分异步操作放入组中,实现loop管理
class asynchronous_fetcher_3(tornado.web.RequestHandler):
    async def get(self):
        body = await asynchronous_fetch(url)
        await asyncio.wait([sleep() for i in range(3)])
        print("end request")
        self.write("%s,%s" % (body, self.request.request_time()))

# curl "127.0.0.1:8888/3"
# b'{\n  "data": "123"\n}\n',10.001000165939331

# 异步非阻塞-将所有异步操作放入组中,实现loop管理
class asynchronous_fetcher_4(tornado.web.RequestHandler):
    async def get(self):
        task_list = [sleep() for i in range(3)]
        task_list.append(asynchronous_fetch(url))
        body = await asyncio.wait(task_list)  # 将所有异步操作的结果返回,但是是无序的,要是需要返回结果的话解析起来比较麻烦
        print("end request:", body)
        # print(type(body), len(body),type(body[0]),len(body[0]),type(body[0]))
        self.write("%s,%s" % ([x.result() for x in body[0] if x.result() is not None][0],
                              self.request.request_time()))
# curl "127.0.0.1:8888/4"
# b'{\n  "data": "123"\n}\n',5.006999969482422

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        (r"/1", asynchronous_fetcher_1),
        (r"/2", asynchronous_fetcher_2),
        (r"/3", asynchronous_fetcher_3),
        (r"/4", asynchronous_fetcher_4),
        (r"/5", synchronous_fetcher),
        (r"/6", synchronous_geter),

    ], **settings)


if __name__ == "__main__":
    print("server start!")
    app = make_app()
    server = tornado.httpserver.HTTPServer(app)
    server.bind(8888)
    server.start(1)  # forks one process per cpu,windows上无法fork,这里默认为1
    tornado.ioloop.IOLoop.current().start()
1.Tornado使用单线程事件循环,写的不好,会阻塞的非常严重,比如synchronous_geter
2.flask+celery可以完成常见的异步任务
3.await语法只能出现在通过async修饰的函数中
4.可以看到tornado.gen.coroutine, tornado.concurrent.run_on_executor,tornado.web.asynchronous,tornado.gen.coroutine等这些装饰器都不在经常使用了,都由async和await代替
https://zhuanlan.zhihu.com/p/27258289   # python async/await入门指南
http://www.tornadoweb.org/en/stable/guide/intro.html    # 这个官网
https://www.osgeo.cn/tornado/guide/intro.html   #Tornado 1.0 - Tornado 6.0的更新说明,以及6.0版本的中文文档,适合英语不好的人阅读
https://www.osgeo.cn/tornado/releases/v5.0.0.html#  在Python 3上, IOLoop 总是包装asyncio事件循环。

On Python 3, IOLoop is always a wrapper around the asyncio event loop.
这是我重新复习tornado的原因,tornado放弃了之前自己实现的tornado.ioloop,全面拥抱asyncio的event_loop.这个改动是非常大的,
而且阅读tornado的源码可以发现其中大部分函数都支持了类型检验,和返回值提示,值得阅读.

--结束END--

本文标题: tornado6与python3.7

本文链接: https://www.lsjlt.com/news/193376.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • tornado6与python3.7
    __auth__ = "aleimu" __doc__ = "学习tornado6.0+ 版本与python3.7+" import time import asyncio import tornado.gen import torn...
    99+
    2023-01-31
  • Django2.0 Python3.7
    注意目录位置     python3 manage.py runserver ip:port ip:port可以不写默认的是本机IP 127.0.0.1 port 8000 登录成功如下: 打开浏览器输入 127.0.0.1:8...
    99+
    2023-01-30
  • ansible2.7 python3.7
    ./configure --prefix=/ansible/python make make install报错: ModuleNotFoundError: No module named '_ctypes'解决方法: 下载安装:li...
    99+
    2023-01-31
  • centos7 python3.7+vi
    安装python3.7https://www.python.org/downloads/https://www.python.org/downloads/release/python-372/wget https://www.python...
    99+
    2023-01-31
    vi
  • Python3.7 dataclass使
    本文将带你走进python3.7的新特性dataclass,通过本文你将学会dataclass的使用并避免踏入某些陷阱。 dataclass简介 dataclass的使用 定义一个d...
    99+
    2023-01-30
    dataclass
  • Linux安装Python3.7
    0.下载安装包 https://www.python.org/downloads/release/python-370/ 1.安装3.7之前要先安装一些依赖包     sudo apt-get update     sudo apt-g...
    99+
    2023-01-31
    Linux
  • python3.7——openssl升级
    Python3.7使用的openssl为1.0.2版本或1.1以上的版本Centos .9安装openssl 1.1版本 [root@python3_7 soft]# mkdir –p /soft[root@python3_7 soft]#...
    99+
    2023-01-31
    openssl
  • python3.7安装cx_Oracle
    操作系统: win7-32bit python版本:3.7.0 oracle版本:10.2.0 // pip方式安装 // 打开cmd输入如下命令 pip install cx_Oracle 自动下载并安装完成后,进入C:\U...
    99+
    2023-01-31
    cx_Oracle
  • Win10 安装Python3.7
    浏览器打开 https://www.python.org/等网页完全打开,鼠标放到Downloads上 浏览器打开 https://www.python.org/ftp/python/3.7.2/ 右键-我...
    99+
    2023-01-31
  • Mac安装Python3.7
    Python 目前有两个版本一个是 Python2,一个是Python3,当然我们在学习一门技术的时候,应该是开始学习比较新的,而且官方也是推荐大家使用Pyhton3,所以接下来我们学习的版本都是以 Python3 来开始的。 M...
    99+
    2023-01-31
    Mac
  • Centos安装Python3.7
    yum install libffi-devel gcc zlib* -y wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz && tar -zxf ...
    99+
    2023-01-31
    Centos
  • python3.7 错误: Modul
    原因及处理: 在使用python是经常会用到import一个第三方库,但是有时候会提示某个模块不存在,如Crypto 其实是因为Python3里面这个模块的名字变了, pip install pycrypto试试安装成功后,如果还是提示...
    99+
    2023-01-31
    错误 Modul
  • python3.6替换python3.7
    使用低版本的python替换高版本的python只需要把环境变量中PATH的第一个python的路径替换成低版本的python的路径就行了。 在编译python脚本的时候电脑就是使用第一个找到的python路径里的那个版本 具体的方式是:...
    99+
    2023-01-31
  • Python3.7与Python2.7怎么在centos7下兼容并存
    本篇内容介绍了“Python3.7与Python2.7怎么在centos7下兼容并存”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、下载p...
    99+
    2023-06-02
  • python3.7 的新特性
    转载Python 3.7增添了众多新的类,可用于数据处理、针对脚本编译和垃圾收集的优化以及更快的异步I/O。Python这种语言旨在使复杂任务变得简单,最新版本Python 3.7已正式进入测试版发布阶段。Python 3.7的最终版定于...
    99+
    2023-01-31
    新特性
  • Centos7 安装Python3.7
    # 更改yum源 cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.bak wget -O CentOS-Base.repo http://mirrors.aliyun.co...
    99+
    2023-01-31
  • Python3.7下载安装
    1. 在python的官网下载python对应版本:https://www.python.org/downloads/windows/      64位下载Windows x86-64 executable installer...
    99+
    2023-01-31
  • Debian 9安装 Python3.7
    问题一 zipimport.ZipImportError: can't decompress data; zlib not available Makefile:1130: recipe for target 'install' faile...
    99+
    2023-01-31
    Debian
  • Centos7安装Python3.7(兼
    Centos7下已自动安装Python2.7.5,but现在经常会出现Python2和Python3兼容使用的情况,所以我现在记录下安装过程。上一篇文章我写过Centos6.5下升级Python2.7的操作Centos下升级Python本次...
    99+
    2023-01-31
  • centos7下安装Python3.7(
    2019-01-22   22:50:05 centos7默认安装的是python2.7,然而python2基本上要淘汰了,所以有必要安装最新的python3 python,g++这些工具一般安装在/usr/bin目录里 通过指令ll p...
    99+
    2023-01-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作