有关Tornado 异步的讨论

2013-11-11 10:21:06 +08:00
 geew
最近开始用tornado, 之前接触过的框架有django和flask. tornado的标榜就是异步, 但是在开发的过程中没怎么感觉到. 可能是我的使用问题吧.对异步这些东西的理解不是那么的透彻. 故此希望大家一起讨论下:

1.tornado异步的存在是需要程序中的各个处理均是异步的才行么? 比如访问数据库, 同步的访问的话tornado的异步貌似没有作用. 以及一些比较耗时间的任务, 都需要异步的写法才行, 并不是yield tornado.gen.Task(model.func, args=args)这样了之后就是异步执行了.

2.如果一成立的话每个函数都需要异步的写法, 问题就来了, 异步的程序怎么写呢? 我觉得这个问题挺大, 对异步的东西不是很了解. 还是比如访问数据库, 怎么做到异步的呢? 需要响应的数据库驱动支持么还是?

3.如果这样的话, tornado的优势在哪里呢? tornado的堵塞是会堵塞整个服务器, 好恐怖的赶脚.

PS: 好吧, 我就是想问问异步的程序怎么写的?
比如: yield tornado.gen.Task(model.func, args=args)
然后:
def func(args, callback=None):
time.sleep(10)
data = get_from_mysql(args)
if callback: callback(data)
return data
其实同样的堵塞, 完全没有异步执行, 那以上的程序怎么改成异步的呢??
20367 次点击
所在节点    Tornado
35 条回复
zenliver
2013-11-12 22:00:36 +08:00
@fansgentle 程序随小, 五脏俱全,,,呵呵
justfly
2013-11-13 17:33:06 +08:00
geew
2013-11-22 14:46:47 +08:00
@cctvsmg 少年 说好的ORM呢 想研究研究下 谢谢了
cctvsmg
2013-11-22 15:08:05 +08:00
@geew 可以先研究研究peewee 和 umysqldb相结合,另外https://github.com/BeanYoung/peewee这个版本加进去了connection pool,ndb那个因为是菲关系型的orm还在试验中。
geew
2013-11-22 17:49:23 +08:00
@justfly 使用celery的话只要 pip install tornado-celery就行了吗?
import tcelery 来用的话会有这个错误:
怎么 AttributeError: 'module' object has no attribute 'celery_task'

tcelery里面没有celery_task这个东西呢??
justfly
2013-11-22 20:55:48 +08:00
@geew 新版本问题吧,是我引用的代码,celery依赖环境很多,我没有测试。你可以看一下这里的介绍:https://github.com/mher/tornado-celery

不出意外你要启动一个单独的 celery 进程来专门处理这些异步job的。像这样:http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

请求不是非常频繁的话用线程吧,依赖少一些,线程池大小要自己把握,毕竟不配置的话默认linux一个线程8M 内存
geew
2013-11-25 11:33:10 +08:00
@zenliver 试过了 但要tornado3.x以上才能运行的
geew
2013-11-25 11:34:57 +08:00
@justfly 嗯 还得研究研究下. 你引用的代码是使用了这个的https://github.com/mayflaver/tornado-celery . tornado 2.x不能运行. 3x才行

有用tornado-celery tornado版本2.2的demo么, 照着官方的做总是出现各种各样的问题
geew
2013-11-25 12:01:19 +08:00
@justfly
@fansgentle
有些浮躁了 我还是好好看看下celery的文档再说
neoz
2014-06-21 13:31:27 +08:00
@fansgentle 请问tornado的request_time应该怎么实现?
fansgentle
2014-06-25 10:05:16 +08:00
自己写的话可以这样

class BaseHandler(tornado.web.RequestHandler):

def initialize(self):
self._start_time = time.time()

def on_finish(self):
self._finish_time = time.time()
# deal request_time

另tornado.web.RequestHandler实例的request属性有request_time方法:
https://github.com/tornadoweb/tornado/blob/4e9de2e43f50ae8a5317d4287d592904cf39a9e5/tornado/httputil.py#L399
fansgentle
2014-06-25 10:07:28 +08:00
@neoz 以上
sujunj2005
2014-11-26 11:27:36 +08:00
这么一说tornado易用性没有这么好啊,亏我们还在用tornado+motor
geew
2014-11-26 11:47:52 +08:00
@sujunj2005 好不好各有评判吧 不过要是真正的用好tornado 也是挺不容易的
geew
2014-11-26 11:48:25 +08:00
@sujunj2005 http://www.nowamagic.net/academy/detail/13321030 看源码去吧 估计会有其他的体会

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/88797

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX