Python 并发编程从入门到进阶
小职 2021-12-29 来源 :dongfanger 阅读 1426 评论 0

摘要:本篇介绍了Python 并发编程从入门到进阶,通过具体的内容展现,希望对大家Python的学习有所帮助。

本篇介绍了Python 并发编程从入门到进阶,通过具体的内容展现,希望对大家Python的学习有所帮助。

Python 并发编程从入门到进阶

Python多线程

Python有真正的多线程吗?我本来以为是没有的。因为CPython解释器本身就不是线程安全的,因此有全局解释器锁(GIL),一次只允许使用一个线程执行Python字节码。换句话说,Python即便是有多线程,也会受GIL限制,按顺序执行。所以我就以为Python是没有多线程的,也就是一个Python进程不能同时使用多个CPU核心。然而,Python标准库中所有执行阻塞型I/O操作的函数,在等待操作系统返回结果时,都会释放GIL,允许其他线程运行。这就意味着Python线程在I/O密集型应用中还是可以发挥作用的,比如一个Python线程等待网络响应时,阻塞型I/O函数会释放GIL,再运行一个线程。再比如time.sleep()函数也会释放GIL。

 

Python多进程

但是对于CPU密集型应用来说,要想利用所有可用的CPU核心,就得使用多进程,规避GIL。

 

多线程与多进程对比

什么时候用多线程?什么时候用多进程?

 

I/O密集型应用使用多线程,CPU密集型应用使用多进程。

 

什么是I/O密集型应用?什么是CPU密集型应用?

 

简单来说,I/O密集一般涉及到网络、磁盘IO。而CPU密集指的是计算比较多。

 

创建多线程可以使用concurrent.futures,创建多进程可以使用multiprocessing。

 

多线程与协程对比

多线程存在着切换开销,同时为了避免写变量冲突,在控制共享资源时需要加锁,因此编写程序会比较复杂比较困难。而协程是通过单线程实现的并发,既能自由切换,也不需要锁机制,执行效率要高很多。

 

多线程和协程有个共同点是只对I/O密集型应用有效,因为GIL限制。如果想处理CPU密集型应用,那么可以结合多进程一起使用,以提高CPU使用率。

 

asyncio包

asyncio包比较多用来实现Python协程并发,原书在这一章节引用了很多示例,穿插了很多代码,导致我看起来有点乱,不是很清楚到底该怎么使用这个包。所以我看了一下官方文档:

 

https://docs.python.org/3/library/asyncio.html

 

 Python 并发编程从入门到进阶

 

从Python3.5开始引入了async和await,替代了@asyncio.coroutine和yield from语法,语义更简洁更明确了。并且从Python3.7开始引入了asyncio.run(),替代了这一串代码:

 

loop = asyncio.get_event_loop()

try:

    loop.run_until_complete(main())

finally:

    loop.close()

创建task的语法也发生了变化,可以用asyncio.create_task:

 

async def coro():

    ...

 

# In Python 3.7+

task = asyncio.create_task(coro())

...

 

# This works in all Python versions but is less readable

task = asyncio.ensure_future(coro())

...

对于多个并行task可以用asyncio.gather,替代asyncio.wait:

 

task_list = []

    for i in range(5):

        task = asyncio.create_task(async_func(i))

        task_list.append(task)

 

done, pending = await asyncio.wait(task_list, timeout=None)

for done_task in done:

        print((f"[{current_time()}] 得到执行结果 {done_task.result()}"))

task_list = []

    for i in range(5):

        task = asyncio.create_task(func(i))

        task_list.append(task)

results = await asyncio.gather(*task_list)

for result in results:

        print((f"[{current_time()}] 得到执行结果 {result}"))

所以对于第三方包的学习,最好是看看最新的官方文档,说不定已经进行了很多优化。


208小时视频教程,995份干货资料,领取资料+高薪就业咨询V:z_zhizuobiao

Python 并发编程从入门到进阶

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程