如何在tornado中以异步的方式调用同步函数
问题
如何在tornado的coroutine中调用同步阻塞的函数
解决方案
使用python内置标准库的concurrent.futures.ThreadPoolExecutor和tornado.concurrent.run_on_executor
解决示例
a.使用concurrent.futures.ThreadPoolExecutor
#-*-coding:utf-8-*-
import time
from tornado.gen import coroutine
from tornado.ioloop import IOLoop
from concurrent.futures import ThreadPoolExecutor def func():
time.sleep(2)
print(10) def foo():
time.sleep(1)
print(15) @coroutine
def main():
pool = ThreadPoolExecutor(2)
@coroutine
def sync_func1():
yield pool.submit(func,) @coroutine
def sync_func2():
yield pool.submit(foo,)
t1 = time.time()
yield [sync_func1(), sync_func2()]
print(time.time() - t1) if __name__ == '__main__':
IOLoop.current().run_sync(main)
b.使用run_on_executor
#-*-coding:utf-8-*-
import os.path
import time
from tornado.gen import coroutine
from tornado.ioloop import IOLoop
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor class My(object):
def __init__(self):
self.executor = ThreadPoolExecutor(3) @run_on_executor
def f(self):
print(os.path.join(os.path.dirname(__file__), 'python'))
time.sleep(2)
print(10) @run_on_executor
def f1(self):
time.sleep(1)
print(15) @run_on_executor
def f2(self):
time.sleep(1.5)
print('hello, world!') @coroutine
def main():
m = My()
t1 = time.time()
yield [m.f1(), m.f2(), m.f()]
print(time.time() - t1) if __name__ == '__main__':
IOLoop.current().run_sync(main)
总结
我们直接运行上面的两个同步的函数,耗时需要3秒。但我们利用了ThreadPoolExecutor之后,总耗时只需要2秒左右。下面是运行结果:
---------------------
作者:Easy_to_python
来源:CSDN
原文:https://blog.csdn.net/hjhmpl123/article/details/53673108
版权声明:本文为博主原创文章,转载请附上博文链接!
如何在tornado中以异步的方式调用同步函数的更多相关文章
- YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法
上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...
- AJAX中的请求方式以及同步异步的区别
AJAX中的请求方式以及同步异步的区别请求方式,分为GET与POST: GET 最为常见的HTTP请求,普通上网浏览页面就是GET.GET方式的参数请求直接跟在URL后,以问号开始.(JS中用wind ...
- RTX——第19章 SVC 中断方式调用用户函数(后期补历程)
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式 ...
- 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档
在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...
- 通过队列实现进程间的通信(使用阻塞方式调用func函数)
#_author:来童星#date:2019/12/17#通过队列实现进程间的通信from multiprocessing import Poolimport osimport timedef fun ...
- 【Chrome】如何在C++中增加给JavaScript调用的API
本文示例说明了如何在Chrome浏览器中增加JavaScript API.为了简化,先假设是在已有的namespace中增加一个新的API,文章的最后将指出如果增加一下全新的namespace所需注意 ...
- FineReport中以jws方式调用WebService数据源方案
在使用WebService作为项目的数据源时,希望报表中也是直接调用这个WebService数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢? 在程序中访问WebService应用服务, ...
- Java中通过脚本引擎调用js函数
import java.io.*; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.scri ...
- VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)
转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...
随机推荐
- 微信小程序——组件(一)
接着之前讲解的基础内容,应该对小程序有了一点了解.想深入了解的话,需要自己实际操作一遍比较好.首先了解官方给的组件,API等这样等顺序来比较好一些.下面贴两张demo图,demo的项目结构是设置的两个 ...
- JDBC事务和数据库事务嵌套的讨论 .
首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLExceptio ...
- mysql8采用caching-sha2-password加密
因为搭建docker容器mysql,直接pull mysql latest版本,因为目前mysql的版本已经升级到了8.0. 像我们之前链接mysql的方式,或者说客户端,就不行了. 比如navica ...
- Json.Net 中Linq to JSON的操作
Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...
- PHP-------ajax返回值 返回JSON 数据
ajax返回值 返回JSON 数据 ajax返回值 有text JSON ajax返回值 返回JSON 数据 <title>无标题文档</title> <sc ...
- HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】
题目链接 HDU 1166 大概题意: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工 ...
- Kali-linux基本设置
1.6.1 启动默认的服务 Kali Linux自带了几个网络服务,它们是非常有用的.但是默认是禁用的.在这里,将介绍使用各种方法设置并启动每个服务. 1. 启动Apache服务 启动Apache服务 ...
- protected internal 和internal 区别
private:只能在本类中使用protected:在本类中及其子类中可以使用 可以跨程序集 internal:同一命名空间(程序集)中的类可以使用 限定的是只有在同一个程序集中才可以访问,可以跨 ...
- 面试准备——(三)Selenium面试题总结
一.Selenium基本知识 1. 什么是Selenium? Selenium是浏览器自动化工具,主要用来Web的自动化测试,以及基于Web的任务管理自动化.它支持的语言有:python.Java.r ...
- POST接口底层方法
对于POST请求的接口,我们如何调用它获取到数据,这其中自然少不了底层代码 底层公共类的书写 public class ThirdOpenAPIService { public static Thir ...