线程 协程 python_在Python 的线程中运行协程的方法

在一篇文章 理解Python异步编程的基本原理 这篇文章中,我们讲到,如果在异步代码里面又包含了一段非常耗时的同步代码,异步代码就会被卡住。

那么有没有办法让同步代码与异步代码看起来也是同时运行的呢?方法就是使用事件循环的.run_in_executor()方法。

我们来看一下 Python 官方文档[1]中的说法:

那么怎么使用呢?还是以非常耗时的递归方式计算斐波那契数列的这个函数为例:

def sync_calc_fib(n):

if n in [1, 2]:

return1

return sync_calc_fib(n - 1) + sync_calc_fib(n - 2)

async def calc_fib(n):

result = sync_calc_fib(n)

print(f'第 {n} 项计算完成,结果是:{result}')

return result

我们现在需要用 aiohttp 访问一个延迟5秒的网页,同时计算斐波那契数列第36项。

首先我们看看单独计算第36项需要5秒钟:

我们再来看看如果直接把这计算斐波那契数列和请求网站的两个异步任务放在一起“并行”,实际时间是两个任务的时间叠加:

具体原因我在上一篇文章里面已经做了说明。

现在,我想让两个任务“同时运行”,于是就可以这样修改代码:

import aiohttp

import asyncio

import time

from concurrent.futures import ThreadPoolExecutor

async def request(sleep_time):

async with aiohttp.ClientSession() as client:

resp = await client.get(f'http://127.0.0.1:8000/sleep/{sleep_time}')

resp_json = await resp.json()

print(resp_json)

def sync_calc_fib(n):

if n in [1, 2]:

return 1

return sync_calc_fib(n - 1) + sync_calc_fib(n - 2)

def calc_fib(n):

result = sync_calc_fib(n)

print(f'第 {n} 项计算完成,结果是:{result}')

return result

async def main():

start = time.perf_counter()

loop = asyncio.get_event_loop()

with ThreadPoolExecutor(max_workers=4) as executor:

tasks_list = [

loop.run_in_executor(executor, calc_fib, 36),

asyncio.create_task(request(5))

]

await asyncio.gather(*tasks_list)

end = time.perf_counter()

print(f'总计耗时:{end - start}')

asyncio.run(main())

运行效果如下图所示:

在5秒钟的时间,就把计算斐波那契数列和请求5秒延迟的网站都做完了。

实现这样的转变,关键的代码就是:loop.run_in_executor(executor, calc_fib, 36)

其中的 loop就是主线程的事件循环(event loop),它是用来调度同一个线程里面的多个协程。

executor是我们使用ThreadPoolExecutor(max_workers=4)创建的一个有4个线程的线程池,calc_fib是一个耗时的同步函数,36是传入calc_fib的参数。loop.run_in_executor(executor, calc_fib, 36)的意思是说:

把calc_fib函数放到线程池里面去运行

给线程池增加一个回调函数,这个回调函数会在运行结束后的下一次事件循环把结果保存下来。

请注意上图中红色箭头对应的calc_fib这是一个同步函数,请与上一篇文章中的异步函数区分开。run_in_executor的第二个参数需要是一个同步函数的函数名。

在上面的例子中,我们创建的是有4个线程的线程池。所以这个线程池最多允许4个阻塞式的同步函数“并行”。

总结

到此这篇关于在Python 的线程中运行协程的方法的文章就介绍到这了,更多相关python线程中运行协程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: 在Python 的线程中运行协程的方法

本文地址: http://www.cppcns.com/jiaoben/python/301339.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php登录个性验证码,PHP七种不同的个性创意验证码例子

验证码图片html代码:第一个图像验证码类,其他6种验证码类请下载查看:class captcha{/**----------------------------------------------------------* 生成验证码----------------------------------------------------------* static* access public------------------------…

突发!ASML断供中芯国际

来源:芯榜据日经新闻6日报道,荷兰半导体设备供应商阿斯麦尔(ASML)供应极紫外光(EUV)光刻机给中芯国际的计划已经中止,多位ASML供应商关系人士指出,ASML是为了避免因供应最先进的设备…

字符串相似度匹配算法python_算法字符串相似度得分/哈希

有趣的问题。我在这一领域的经验有限,但由于Levenshtein距离满足三角形不等式,我认为必须有一种方法来计算到原点的某种绝对距离,以便在不与整个数据库中的所有条目进行直接比较的情况下找到彼此邻近的字符串。在第26页,他讨论了基…

马化腾:微信将被谁颠覆,领衔下一代互联网的终端居然是?

来源:梧桐会导语1、10年一更替,互联网格局将如何演变?2、第三代互联网谁主沉浮?3、谁是下一个苹果,谁是下一个诺基亚?4、全球科技巨头的下一步动作是什么&#xf…

PHP基础班初学感悟

不知不觉差不多一个月就过去了 刚到培训班那时候的心情,现在也还能有所感觉 作为今年6月份的毕业生,刚从大学的实习期出来,辞掉了上一份工作,本来是打算找一份更加与专业挂钩的工作做的 也许是90后对网络的情有独钟,亦…

matlab trendsurface,MATLAB 添加新的预测性维护产品

图1:源自脉宽调制波形的脉宽趋势和跟踪。中心迹线(橙色)是脉宽的跟踪。该波形包含与采集波形相同的100k个点。对每个测量值进行升采样(upsampled,即加大采样率)以匹配源波形每个周期的持续时间。跟踪图始终与源波形同步。由于跟踪功能具有时间同步特性&a…

苹果一键越狱工具_最新苹果越狱工具现世,可越狱所有iOS版本!

出于安全原因考虑,apple默认是不允许用户有iPhone和其他iOS设备的完全控制权限。越狱是指通过利用iOS操作系统中的漏洞使得可以通过定制的软件来获取设备的root和完全访问权限。近日,一个由黑客、安全研究人员和逆向工程师组成的团队——Unc0ver&#xf…

你认识的世界与客观世界间差了N光年

想象一下这样的场景,你得到一个金属盒子并被告知不可能知道盒子里的内容。你可以尝试钻它,烧它,用 X 射线照它,摇晃它,打破它以及其他各种手段,但是你永远无法打开它或者知道里面是什么。这个盒子里装着的就…

php.h: No such file or directory

建立一个php的include路径到/usr/include的软连接就好了 ln -s /usr/include/php-zts/* /usr/include/转载于:https://www.cnblogs.com/yangxunwu1992/p/6059286.html

区块链 matlab,matlab可以实现区块链吗?

用MATLAB实现区块链:把区块对象连成链现在可以把区块连成区块链了,我们用一个新的类叫做BlockChain来模拟它。 首先规定该链中的第一个block可以直接产生,就是genesisblock,这就是上面Block的construtor中,输入参数个数等于2是返回的对象.cla…

qt 通过类实现画图_QT案例IDE编写 通过枚举实现编码切换

低谷期一定要默默的熬过去,别去打扰任何人,否则留下的只是别人的笑柄,不论幸或不幸,你的挣扎无人能见,无人能懂。。。---- 网易云热评一、定义一个枚举enum MyCode{ utf_8,gbk};二、定义一个枚举变量,默…

美国在人工智能领域亟待解决的5大难题

来源:战略前沿技术据C4ISRNET网站报道,根据2018年《国防授权法案》,美国国会组建了由多名技术专家组成的人工智能国家安全委员会,以指导美国人工智能技术的发展。该委员会由谷歌母公司Alphabet前负责人埃里克施密特(Er…

查看ie保存的表单_小学信息技术gt;搜索保存网页教师资格证面试模板

中小学教师资格证考试面试真题备考纸:小学信息技术《搜索保存网页》微博中小学教师资格证考试小学信息技术《搜索保存网页》一、考题回顾试讲题目1.题目:搜索保存网页2.内容:搜索引擎是一个对因特网上的信息资源进行搜集整理,为人…

一线专家谈2020年人工智能落地趋势

来源:海豚大数据及人工智能实验室转眼间,2019年只剩下不到两个月了。人工智能的热度依旧,只是在资本市场,看空的投资人也越来越多了。从当年大数据的发展趋势看,这种情况反而对产业发展是有利的。因为这意味着&#xf…

C# DataSet转JSON

经常会遇到系统数据交互采用JSON数据格式进行交互的,避免不必要的重复工作,记录下自己的处理方式。 获取数据集之后,通过函数对数据集信息进行整理通过.Net Framework3.5提出的JavaScriptSerializer类进行DataSet数据的序列化, 需…

zset中的score_Redis 在项目中合理使用经验总结

背景Redis 是一个开源的内存数据结构存储系统。可以作为数据库、缓存和消息中间件使用。支持多种类型的数据结构。Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU ev…

八种颠覆未来作战的前沿技术

来源:军事高科技在线目录一、颠覆未来作战的前沿技术系列——脑科学二、颠覆未来作战的前沿技术系列——人体增强三、颠覆未来作战的前沿技术系列——石墨烯四、颠覆未来作战的前沿技术系列——超材料五、颠覆未来作战的前沿技术系列——太赫兹技术六、颠覆未来作战…

Linux下查看/管理当前登录用户及用户操作历史记录

转载自: http://www.cnblogs.com/gaojun/archive/2013/10/24/3385885.html 一、查看及管理当前登录用户 1、使用w命令查看登录用户正在使用的进程信息,w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/…

python狗图像识别_TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

本文是Python通过TensorFlow卷积神经网络实现猫狗识别的姊妹篇,是加载上一篇训练好的模型,进行猫狗识别本文逻辑:我从网上下载了十几张猫和狗的图片,用于检验我们训练好的模型。处理我们下载的图片加载模型将图片输入模型进行检验…

Java对象垃圾回收调用,JVM垃圾回收之哪些对象可以被回收

1.背景Java语言相比于C和C,一个最大的特点就是不需要程序员自己手动去申请和释放内存,这一切交由JVM来完成。在Java中,运行时的数据区域分为程序计数器、Java虚拟机栈、本地方法栈、方法区和堆。其中,程序计数器、虚拟机栈和本地方…