Python的并发支持与C#和C++的比较
我想找一个对这两种语言都有深入了解的人来解释一下。有人用过C#和C++吗?我知道C#从.Net 4.0开始提供了一个任务并行库。而C++也有一个并发运行时库,具体可以查看这个链接:http://msdn.microsoft.com/en-us/library/dd504870.aspx。
那么,在Python的网页应用中,如何实现并发呢?我想要的是使用线程来处理任务,而不是生成新的进程。假设用户能够管理锁等问题。
2 个回答
警告:并发和并行是两回事。沃伦说得对,Python中的全局解释器锁(GIL)限制了单个进程的并行处理,但如果这个进程主要是处理输入输出(IO),那么基于select的应用程序可以在没有并行的情况下提供足够的并发性(Python的asyncore文档中对基于select的工作流程有很好的讨论)。
话虽如此,Python的Twisted框架提供了一种叫做deferred的未来对象,并且在后台实现了多线程(显然,GIL限制了每个进程在任何时刻只能有一个线程)。不过,有些人觉得Twisted太底层,或者deferred对于开发网页应用来说太复杂。
在极端情况下,从Python调用的本地代码可以释放GIL,只要这个本地代码不与Python对象进行交互。例如,ctypes提供了一个基本的接口来调用C语言函数,并在C函数运行时释放GIL。使用其他扩展框架,比如Boost.Python和SIP,也能达到类似的效果。
Python有一个叫做全局解释器锁的东西,这个锁会阻止多个线程同时执行,也就是说它不支持并发。这就是为什么很多人在Python中想要实现并发时,会选择创建多个进程。相比之下,C#和C++允许多个线程同时运行。
如果你想了解更多关于为什么Python会有这个全局解释器锁的信息,可以查看这个链接:为什么会有全局解释器锁?。