关于python的多线程(GIL)只适合用于处理IO操作的困惑?
天蓬老师
天蓬老师 2017-04-18 10:03:03
[Python讨论组]

问题一

看了一些关于python中全局锁的文章,大概意思是说python中所有的多线程都会受GIL这把大锁的控制,python实际上只能在一个cpu下面执行,多线程只是内部调度带来的错觉。

但是对于处理IO操作而非计算操作的线程,python的多线程还是非常有用的。

对于上面这句话,请问意思是说在执行相关的文件读写(IO操作)的这个线程,在执行文件读写操作的这个线程会暂时释放手中的GIL,把CPU的控制权交给其他的线程吗?

问题二

看到书上说对于web程序的瓶颈很多时候是由于IO操作导致的,请问这句话有该怎么理解?web应用(django/flask等)中的一次请求和IO操作有啥关系,不是只有一次socket的建立吗?或者这里说的IO操作是对于数据库的查询,数据库的查询会拖累整个程序的速度?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
天蓬老师

问题一 对于处理IO密集型的应用来说,多线程还是有用的,毕竟IO操作无论是网络IO还是磁盘IO,很多时候都是在等待数据返回,此时会释放GIL锁,这个时候其他线程是可以继续执行的。对于计算密集型的应用可以考虑使用multiprocessing,基于多进程的,可以充分利用多核的特性,对于每一个进程都有独立的GIL。不需要互相争抢资源。

问题二 此处的IO是指网络IO。这个关乎到你的服务器性能,网络延迟,带宽大小。譬如千兆网络与百兆网络传输速度肯定不一样。

PHP中文网

需要对Python解释器有一些了解,如果是I/O密集型的操作,每当堵塞等待I/O操作时解释器都会释放GIL,对于没有太多I/O操作的代码而言,更倾向于在该线程整个时间段内始终占有处理器和GIL, 就是说I/O密集型的Python程序要比计算密集型的更好地利用多线程(python核心编程第3版一句话)。

可以使用楼上的multiprocessing来代替多线程,因为它使用的是多进程,每个进程有自己的独立的GIL。不过也有不足,它的引入会增加程序实现时线程间数据通信和同步的困难。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号