据我了解,GIL使得不可能拥有单独使用每个内核的线程。
这是一个基本问题,但是threading
库的意义是什么?如果线程代码具有与普通程序相同的速度,这似乎毫无用处。
答案 0 :(得分:6)
在某些情况下,应用程序甚至可能无法充分利用一个内核,而使用线程(或进程)可能有助于做到这一点。
考虑一个典型的Web应用程序。它接收来自客户端的请求,对数据库进行一些查询,然后将数据返回给客户端。鉴于IO操作大多数时候都比CPU操作慢几个数量级,因此此类应用程序正在等待IO完成。首先,它等待从套接字读取请求。然后,它一直等到对数据库的请求写入打开到DB的套接字中。然后,它等待数据库的响应,然后将响应写入客户端套接字。
等待IO完成可能需要90%(或更多)的时间来处理请求。当单线程应用程序在IO上等待时,它只是不使用内核,并且该内核可用于执行。因此,此类应用程序甚至可以在单个内核上为其他线程执行提供空间。
在这种情况下,当一个线程等待IO完成时,它将释放GIL,而另一个线程可以继续执行。
答案 1 :(得分:1)
CPython严格支持,支持多io绑定线程+单cpu绑定线程
io绑定方法:file.open,file.write,file.read,socket.send,socket.recv等,当python调用这些io函数时,它将释放GIL并获取GIL io函数后隐式返回
cpu绑定方法:算术计算等。
c扩展方法:方法必须明确调用PyEval_SaveThread和PyEval_RestoreThread来告诉python解释器您正在做什么