如何在脚本里使用 Tornado 的异步

2019-10-31 16:11:20 +08:00
 pompeii

现在有一个简单的脚本,但是其中有几个操作(发送 HTTP 请求并等待响应)比较耗时,有办法用 Tornado 的异步做嘛?如果有的话,应该如何做(之前看的使用异步的例子,都是把 Tornado 作为 web 服务器,现在我只想在脚本里用)?还是应该用 gevent ?或者 Celery ?

1260 次点击
所在节点    问与答
15 条回复
yxcxx
2019-10-31 16:46:51 +08:00
asyncio 不香吗
pompeii
2019-10-31 16:47:58 +08:00
@yxcxx #1 忘记说了,用的 Py2.7,#捂脸
renmu
2019-10-31 16:50:56 +08:00
grequests
locoz
2019-10-31 17:12:02 +08:00
我记得 Tornado 的官方文档里有个样例,就是用 Tornado 的 HTTP Client 做了个简单的爬虫,你要不看看?
justfly
2019-10-31 17:21:44 +08:00
让 io loop run 起来,你的异步逻辑是跑在 io loop 里面的。
ifoolish
2019-10-31 19:23:18 +08:00
from tornado.ioloop import IOLoop
from tornado.httpclient import AsyncHTTPClient
from tornado.gen import coroutine, Return


@coroutine
def get_data():
____http_client = AsyncHTTPClient()
____rsp = yield http_client.fetch(
________'http://httpbin.org/ip',
________method='GET'
____)

____body = rsp.body
____raise Return(body)


if __name__ == "__main__":
____loop = IOLoop.current()
____result = loop.run_sync(get_data)
____print result
ifoolish
2019-10-31 19:24:33 +08:00
前面的空格我替换成了下划线,将就着看吧
pompeii
2019-10-31 20:02:14 +08:00
@renmu #3
@locoz #4

我去研究一下
pompeii
2019-10-31 20:02:39 +08:00
@justfly #5 谢谢谢谢,这个信息很有用
pompeii
2019-10-31 20:03:11 +08:00
@ifoolish #6 太感谢了,想要的就是这个
iPhoneXI
2019-10-31 20:03:40 +08:00
其实没必要
用进程池 /线程池
concurrent.futures
pompeii
2019-10-31 20:09:24 +08:00
@iPhoneXI #11 谢谢,我去研究一下
coroutine
2019-11-10 10:23:18 +08:00
@ifoolish 老哥,9102 年了,有必要把 装饰器 + yield + raise 的写法改为 async await return 了。
ifoolish
2019-11-10 14:05:05 +08:00
@coroutine 看清楚人家楼主说在用 2.7 嘛
coroutine
2019-11-10 14:24:56 +08:00
@ifoolish 嗷没注意看评论抱歉 =。=

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

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

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

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

© 2021 V2EX