理解Python GIL - I/O绑定与CPU绑定
来自Python线程的文档
在CPython中,由于有一个叫做全局解释器锁(GIL)的东西,只有一个线程可以同时执行Python代码(尽管某些专门优化性能的库可能会绕过这个限制)。如果你想让你的应用程序更好地利用多核机器的计算资源,建议使用多进程。不过,如果你想同时运行多个与输入输出相关的任务,使用线程仍然是合适的选择。
现在我有一个线程工作者,像这样
def worker(queue):
queue_full = True
while queue_full:
try:
url = queue.get(False)
w = Wappalyzer(url)
w.analyze()
queue.task_done()
except Queue.Empty:
queue_full = False
这里的w.analyze()
做了两件事
- 使用
requests
库抓取网址 - 使用
pyv8
JavaScript库分析抓取的HTML
据我所知,1
是与输入输出相关的,而2
是与CPU相关的。
这是否意味着,全局解释器锁会影响2
,导致我的程序无法正常工作?
1 个回答
5
GIL
的描述并没有提到正确性,只是说了效率。
如果你的程序是CPU密集型的,也就是说它主要依赖于处理器的计算能力,那么使用线程是无法充分利用多核处理器的,但你的程序依然会正确地运行。
如果你想要充分利用CPU的并行处理能力,应该使用Python的multiprocessing
库。