请教:关于python线程的两个问题

请教:关于python线程的两个问题

1、Python的Global Interpreter Lock是怎么一回事?是否意味着用Python编制的程序难以充分利用多CPU?
2、最新版本的Python是否改进了这个问题。

谢谢!
这个问题  也许不是很好说, 但是可以这么说python是建立在虚拟机也就是pythonxx.dll上运行的, 所以在这个进程里面

所有的线程都是基于轮询方式来调度线程的,当然你也可以开多个实例, 所以python的线程并不不是内核级的多线程,

也不是os级的 而是基于虚拟机之上的, 当然Python多线程这块, 我也一直期望他改进,不过作为动态语言,现在这样架构

够用。


第二你说的不能更好的利用cpu资源,这个不用担心,python如果多线程,还是可以充分利用的,我们这边有上万行的Python程序跑起来空运行占几MB内存cpu也不高,如果任务来了,可以占到1-2G的内存 和大量的CPU

所以你不必担心不会充分利用cpu的问题,这个应该跟你的程序结构和算法,以及任务调度的关系的!
是这样的,去掉GIL没有太大的价值,而且在新版本的python(包括python3k)也是不会取消的。

在1999年Greg Stein和Mark Hammond创建了一个去掉GIL的1.5分支,将GIL替换为细粒度锁。但是,做过了基准测试之后,结果令人失望,在最好的情况下,单线程的效率只有原来的一半。另外去掉 GIL 将会造成对解释器的大量的重写,它会使扩展模块变得复杂,一旦扩展有任何的全局可变数据,将不得不为多线程并发调用做好准备。也可能需要对Python/C API进行改动,它们是为了在一系列的调用中需要对某种对象加锁所需要的。

出于以上考虑,Guido尽管欢迎有人来维护一个无GIL的python分支,但他本人不会花太多精力。

最后,尽管不会取消GIL, 但是着并不意味着不能充分利用多cpu,有一下几种方法:
1.可以创建多个进程而不是线程,进程数和cpu一样多。
2.使用Jython 或 IronPython,可以得到真正的多线程。


QUOTE:
原帖由 青椒不辣 于 2007-10-3 17:52 发表
是这样的,去掉GIL没有太大的价值,而且在新版本的python(包括python3k)也是不会取消的。

在1999年Greg Stein和Mark Hammond创建了一个去掉GIL的1.5分支,将GIL替换为细粒度锁。但是,做过了基准测试之后,结果令人失望,在最好的情况下,单线程的效率只有原来的一半。另外去掉 GIL 将会造成对解释器的大量的重写,它会使扩展模块变得复杂,一旦扩展有任何的全局可变数据,将不得不为多线程并发调用做好准备。也可能需要对 Python/C API进行改动,它们是为了在一系列的调用中需要对某种对象加锁所需要的。

出于以上考虑,Guido尽管欢迎有人来维护一个无GIL的python分支,但他本人不会花太多精力。

最后,尽管不会取消GIL, 但是着并不意味着不能充分利用多cpu,有一下几种方法:
1.可以创建多个进程而不是线程,进程数和cpu一样多。
2.使用Jython 或 IronPython,可以得到真正的多线程。

谢谢青椒不辣和ghostwwl两位的回复。我现在的理解是:去掉 GIL的工作是得不偿失的,细粒度锁版本的效率是原来的1/2;另外,去掉 GIL的工作量是巨大的,要求对Python解释器的大量的重写,因此Guido不愿意做这件事情。


QUOTE:
原帖由 missjiang 于 2007-10-6 23:23 发表

谢谢青椒不辣和ghostwwl两位的回复。我现在的理解是:去掉 GIL的工作是得不偿失的,细粒度锁版本的效率是原来的1/2;另外,去掉 GIL的工作量是巨大的,要求对Python解释器的大量的重写,因此Guido不愿意做这件 ...

恩,想要充分利用多cpu的话,要么在CPython中使用多个进程,要么使用IronPython或者Jython
工作量巨大倒不一定,从Guido的blog中关于为什么去掉GIL不容易的说明 http://blog.csdn.net/gvanrossum/archive/2007/09/12/1782752.aspx主要原因是去掉后,单线程的效率下降太多。所以建议使用多进程。