看了一些关于python中全局锁的文章,大概意思是说python中所有的多线程都会受GIL这把大锁的控制,python实际上只能在一个cpu下面执行,多线程只是内部调度带来的错觉。
但是对于处理IO操作而非计算操作的线程,python的多线程还是非常有用的。
对于上面这句话,请问意思是说在执行相关的文件读写(IO操作)的这个线程,在执行文件读写操作的这个线程会暂时释放手中的GIL,把CPU的控制权交给其他的线程吗?
看到书上说对于web程序的瓶颈很多时候是由于IO操作导致的,请问这句话有该怎么理解?web应用(django/flask等)中的一次请求和IO操作有啥关系,不是只有一次socket的建立吗?或者这里说的IO操作是对于数据库的查询,数据库的查询会拖累整个程序的速度?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
问题一 对于处理IO密集型的应用来说,多线程还是有用的,毕竟IO操作无论是网络IO还是磁盘IO,很多时候都是在等待数据返回,此时会释放GIL锁,这个时候其他线程是可以继续执行的。对于计算密集型的应用可以考虑使用multiprocessing,基于多进程的,可以充分利用多核的特性,对于每一个进程都有独立的GIL。不需要互相争抢资源。
问题二 此处的IO是指网络IO。这个关乎到你的服务器性能,网络延迟,带宽大小。譬如千兆网络与百兆网络传输速度肯定不一样。
需要对Python解释器有一些了解,如果是I/O密集型的操作,每当堵塞等待I/O操作时解释器都会释放GIL,对于没有太多I/O操作的代码而言,更倾向于在该线程整个时间段内始终占有处理器和GIL, 就是说I/O密集型的Python程序要比计算密集型的更好地利用多线程(python核心编程第3版一句话)。
可以使用楼上的multiprocessing来代替多线程,因为它使用的是多进程,每个进程有自己的独立的GIL。不过也有不足,它的引入会增加程序实现时线程间数据通信和同步的困难。