据我所知,全局解释器锁(GIL)使得无法让每个线程单独利用一个核心。
这是一个基本问题,但是,如果使用线程的代码与普通程序具有相同的速度,那么threading
库的作用是什么呢?似乎毫无用处。
据我所知,全局解释器锁(GIL)使得无法让每个线程单独利用一个核心。
这是一个基本问题,但是,如果使用线程的代码与普通程序具有相同的速度,那么threading
库的作用是什么呢?似乎毫无用处。
在某些情况下,应用程序可能无法充分利用甚至一个核心,使用线程(或进程)可以帮助做到这一点。
想象一个典型的Web应用程序。它接收来自客户端的请求,对数据库进行一些查询并将数据返回给客户端。鉴于IO操作比CPU操作慢一个数量级的时间,大多数时候这样的应用程序正在等待IO完成。首先,它等待从套接字读取请求。然后它等待将请求写入打开到数据库的套接字中。然后等待来自数据库的响应以及响应被写入客户端套接字。
等待IO完成可能需要处理请求的时间的90%(或更多)。当单线程应用程序在等待IO时,它只是没有使用核心,该核心可供其他线程在单个核心上执行。
在这种情况下,当一个线程等待IO完成时,它释放GIL,另一个线程可以继续执行。
file.open
、file.write
、file.read
、socket.send
、socket.recv
,Python线程实际上是并行的吗? - redigaffi
multiprocessing
库更有助于您所寻找的内容,因为它可以实际上生成利用各个核心的进程。 - bearplanethreading
库。似乎更多是为了代码组织。 - coolster1278