在我的理解中,在大多数情况下,驱动multi-threading
编程的性能因素并非全部。 (无论Java还是Python)。
我在SO GIL
上正在阅读此enlightening article。文章总结了python采用GIL
机制;即只有single Thread
可以在任何给定时间执行python byte code
。
这使得single thread
应用程序真的更快。
我的问题如下:
由于在给定点只提供一个Thread
,multiprocessing
或thread
模块是否提供了克服GIL强加的限制的方法?如果没有,它们为进行真正的multi-task
工作提供了哪些功能
在接受的答案中,上述帖子的评论部分提出了一个问题,但没有回答?我脑子里也有这个问题
^so at any time point of time, only one thread will be serving content to client...
so no point of actually using multithreading to improve performance. right?
答案 0 :(得分:9)
你是关于GIL的,没有必要使用多线程来进行CPU绑定计算,因为CPU只能由一个线程使用。
但是之前的陈述可能会引起你的注意:如果你的计算不受CPU限制,你可以利用多线程。
一个典型的例子是当你的应用程序花费大部分时间等待某事时。
许多非CPU绑定程序的例子之一: 假设您要构建一个Web爬虫,您必须抓取许多网站,并将它们存储在数据库中,成本倍数是多少?等待服务器发送数据,实际下载数据,并将其存储在数据库中,这里没有任何CPU绑定。在这里,您可以使用爬虫池而不是单个爬虫来获得更快的爬虫。通常情况下,一个网站几乎停机且响应速度很慢(~30秒),在此期间,单线程应用程序将等待网站,您将被卡住。在多线程应用程序中,其他线程将继续爬行,这很酷。
另一方面,由于每个进程有一个GIL,您可以使用多处理来进行CPU绑定计算。
作为旁注,它存在一些或多或少部分没有GIL的Python部分实现,我想提一个我认为很好地实现一些很酷的方法:pypy STM。您可以轻松找到,搜索"摆脱GIL"关于这个主题的很多线索。
答案 1 :(得分:2)
多处理侧面处理GIL问题,因为代码在单独的进程中运行,而GIL仅涉及单个进程。在一个进程中,多线程可能会更快到线程正在等待磁盘或网络等相对较慢的资源。
答案 2 :(得分:1)
快速谷歌搜索产生了这个信息丰富的幻灯片。 http://www.dabeaz.com/python/UnderstandingGIL.pdf
但是它未能向它展示所有线程都包含在进程中的事实。默认情况下,进程只能在一个CPU(或核心)上运行。因此,虽然基于每个进程的GIL确实管理了所述进程中的线程并且并不总是提供预期的性能,但它应该在大规模上比单线程操作执行得更好。
答案 3 :(得分:1)
GIL一直是python中的热门话题,但通常毫无意义。它使大多数程序更安全。如果您想要真正的计算性能,请尝试PyOpenCL。任何现代的真实世界高性能数字运算都应该在GPU上完成(openCL也可以在CPU上运行)。它没有GIL问题。
如果你想在python中进行多线程处理以提高I / O绑定性能,那么GIL不是问题。
最后,如果您想利用多个CPU来提高纯数字运算的性能,并采用pythonic方式,请使用多处理。
但它仍然没有在汇编中编码多线程应用程序那么快。祝你好运没有拼写错误。