惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
IT之家
IT之家
F
Full Disclosure
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
B
Blog
H
Help Net Security
The Cloudflare Blog
Recorded Future
Recorded Future
P
Proofpoint News Feed
P
Proofpoint News Feed
C
Cisco Blogs
T
Tailwind CSS Blog
P
Palo Alto Networks Blog
D
Docker
爱范儿
爱范儿
Know Your Adversary
Know Your Adversary
博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Y
Y Combinator Blog
雷峰网
雷峰网
AWS News Blog
AWS News Blog
D
DataBreaches.Net
博客园 - 司徒正美
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
Blog — PlanetScale
Blog — PlanetScale
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
CXSECURITY Database RSS Feed - CXSecurity.com
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cyber Attacks, Cyber Crime and Cyber Security
腾讯CDC
小众软件
小众软件
G
Google Developers Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
O
OpenAI News

Tornado

docker 多进程部署 tornado - V2EX Tornado 如何拿到传输的文件流 - V2EX tornado 下 ckeditor 图片上传问题 - V2EX Tornado 异步怎么写的? - V2EX tornado 怎么能确保端口挂了 服务也不会停止? - V2EX Tornado 路由有什么好方法,一个一个写太麻烦了,有没有根据 url 和注解匹配的方法呢 - V2EX Tornado V4.5 release pypy 拿到赞助之后出了支持 Python3.5 的版本 - V2EX 请教 tornado 文件上传问题 tornado 做后台服务,如果前端没有用 cookie. - V2EX tornado 优秀项目推荐 问一个 tornado 解决阻塞的方案问题? - V2EX tornaqiniu(基于 tornado 的异步七牛 sdk) tornado 并行异步,如何保证在只有部分请求成功后,结果依旧可用。 - V2EX nginx 反向代理 tornado,如何 location 首页u rl? - V2EX 问一个关于 tornado 异常处理的新手问题 - V2EX tornado 的 coroutine 能和自定义的装饰器一起使用吗?? - V2EX Tornado 并发数很低,正常么? - V2EX 阅读 Tornado 源码过程中的一个疑惑,求解答 - V2EX gtornado - tornado 中 pymysql, pymemcache, storm orm 支持库 - V2EX Tornado 如何组织中大型项目,你们都是怎么样做的? - V2EX tornado 跑不通,小白求帮忙 - V2EX Tornado 4.3 发布 - V2EX Tornado 官方怎么不好好维护一个 sql 的异步数据库驱动? - V2EX 关于 tornado 阻塞的问题 - V2EX tornado 的 mysql 异步驱动性能测试 pypy 之 tornado - V2EX tornado 多个 url - V2EX RequestHandler 类的 get_current_user() 方法覆写无效 tornado 动态添加 url 的问题 tornado 怎么利用'next'参数进行页面跳转 finish() called twice 阿里云 ECS 1CPU 1G 1Mbs 跑 tornado 开多少进程合适? tornado.locale.format_date()的日期汉化问题 Tornado 分页问题求解! Tornado 开发中出错调试如何像 PHP 一样? - V2EX 新手完全不懂 tornado.concurrent.Future 有多少人 有付费学习 Tornado 的意愿,这是一个学习网站。 - V2EX 请问下 tornado 在 ios app 后台方面有成熟的实现吗? 新手求教关于 Tornado + SQLite 的两个问题 - V2EX Tornado 4.1 - V2EX 关于优雅地部署 Tornado 新代码的一种方式 - V2EX Tornado Template 如何获得 JavaScript 中的 var 变量? 学习 "Introduction to tornado" 提问 - V2EX 用 Tornado + Mongodb 开发要注意什么? - V2EX 用 Tornado 做的网站,大家在写测试的时候,一般都是怎么做的呢? - V2EX 分享本人基于 tornado 开发的应用层框架 - V2EX Nginx 多端口运行 Tornado 如何获取当前端口 - V2EX Tornado 框架如何写 MVC 模式? - V2EX
Tornado 的异步 怎么写的 - V2EX
aoscici2000 · 2019-01-15 · via Tornado

这是一个创建于 2708 天前的主题,其中的信息可能已经有所发展或是发生改变。

看得教程一头雾水, 只能理解那个自带的 http 请求, 看了很久也没看到有比如数据库查询, 文件处理什么的其他例子, 后来去看看其他教程, 实现倒算是勉强实现了, 但感觉也太复杂了吧? ?

就比如例子中的我假设有个长耗时的任务, 怎么写才会简单点?


import tornado.ioloop
import tornado.web
import time
import _thread


# 模拟耗时任务
def long_work(arg):
    time.sleep(5)
    yield arg * 1024


def mycoroutine(func):
    def wrapper(self):
        gen = func(self)
        work_gen = next(gen)
        def fun():
            result = next(work_gen)
            try:
            	gen.send(result)
            except StopIteration:
            	pass
        _thread.start_new_thread(fun, ())
    return wrapper


class IndexHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @mycoroutine
    def get(self):
        arg = 10    # 假设请求的参数
        result = yield long_work(arg)
        self.finish(f'<h1>Index {result}</h1>')


class SyncHandler(tornado.web.RequestHandler):
    def get(self):
    	self.write('<h1>SyncHandler</h1>')


def make_app():
    return tornado.web.Application([
        (r'/', IndexHandler),
        (r'/sync', SyncHandler)
    ])


if __name__ == '__main__':
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
    
Vegetable

1

Vegetable      2019 年 1 月 15 日 via iPhone

拥抱 asyncio 吧…
asyncio 比 tornado 好理解的多,回头再来看 tornado 也好

feisan

2

feisan      2019 年 1 月 15 日

1、尽量使用支持 tornado 异步 io 的库,比如用 tornado_mysql 访问 MySQL。
2、配合 ThreadPoolExecutor 使用,把同步阻塞任务放到线程池。
3、把同步阻塞的处理放到一个单独的进程,提供访问接口,然后通过非阻塞的方式去调用它。比如把数据库访问做成独立的 web 服务,然后在 tornado 里用 HTTP 去访问。或者把同步阻塞任务做成 celery 的 task,使用 tornado_celery 取调用。

janxin

3

janxin      2019 年 1 月 15 日

time.sleep 是阻塞操作,因此你这里模拟耗时任务时也是阻塞的。最新的 Tornado 也是使用的 asyncio 驱动了,所以要么考虑一下了解 asyncio ?

显示上下文切换(async/await/@coroutine)之类的,只有在声明处标示切换,如果某函数未切换(无 await)则仍旧是阻塞执行。另外虽然 yield 是在 Tornado 中用于切换,但是不代表用了就是异步行为,这里比较容易混淆。在使用 async/await 语法之后与普通 yield 行为区分开会更清晰。

haozi3156666

5

haozi3156666      2019 年 1 月 15 日

数据库查询用 sqlalchemy 也行的,本身框架不带数据库操作相关模块的

aoscici2000

6

aoscici2000      2019 年 1 月 15 日

@zhengxiaowai 文章倒是大部分看得懂, 但我发现可能大多新手也跟我一样, 迷惑点是耗时操作如何写成不堵的, 教程例子大多都是直接就用 gen.sleep, async.sleep , 关键是这两个东西是怎么实现的(源码也是看得稀里糊涂的)

aoscici2000

7

aoscici2000      2019 年 1 月 15 日

@janxin 看过些, 感觉更难懂哈哈, 主要是很多实例直接就跳过了如何把堵塞的变成不堵的步骤, 我是卡在了这里...比如何如写一个不堵的函数?

janxin

8

janxin      2019 年 1 月 15 日

@aoscici2000 看原理先,不要先看代码。asyncio 的代码质量没有特别高,而且很多边缘状况处理,先从源码很容易迷失。

使用的第一步难道不是先知道我这个是不是异步的么?在 asyncio 中,标记了 coroutine 的都是异步非阻塞的,没标记的都是会阻塞的。先从正确使用开始,换句话说就是没有 await 的地方都有可能阻塞。

aoscici2000

9

aoscici2000      2019 年 1 月 15 日

@janxin 头大就头大在第一步, 到底怎么写才算是非阻塞的, 其实很多教程的实例大致还能理解的, 就是这个 asyncio.sleep(x) 实在想知道它是怎么实现的. 例如下面这段的 work 是怎么样才能实现跟 asyncio.sleep 那样不阻塞得拿到完成的数据

```python
async def work(sec):
time.sleep(sec)
return [i*100 for i in range(sec)]

async def req_a(num):
res = await work(num)
print('in req_a:', res)

async def req_b(num):
res = await work(num)
print('in req_b:', res)

if __name__ == '__main__':
loop = asyncio.get_event_loop()
tasks = [req_a(5), req_b(2)]
loop.run_until_complete(asyncio.wait(tasks))
print('All finished.')
loop.close()
```

coroutine

11

coroutine      2019 年 1 月 16 日

asyncio.sleep 不是 async.sleep,打错

itwhat

13

itwhat      2019 年 5 月 27 日

py3 用 async 加 await,py2 就用协程装饰器(@gen.coroutine)加 yield