在宣传海报上,Python 之父 Guido van Rossum 在 EuroPython 2015 会议的发言分为讲话稿和现场问答部分,但是他上台后将全程改为现场问答的形式。他在回答现场观众的问题前,首先以自己的几个问题和答案推动了会议的进程。话题包括 Python 3(以及3.5),为何没有2.8版本,为什么有这么多开放的bug,Pypy,还有他讨厌 Python 的哪些部分。
Django Girls
Van Rossum 自己的第一个问题是他如何看待 Django Girls ——前一天演讲的主题。他说,这是一次伟大的对话,他热爱讲故事。他的讲话中将不会有相关的内容,或者任何“漂亮的幻灯片”。当他听到Ola...或Ola...为这些幻灯片画了松鼠和獾时,他非常震惊。
他喜欢的另一个方面是他们申明他们不知道他们正在做什么。让他想起了 25 年前开始写 python,他也不知道接下来该怎么做,例如,他不知道一门编程语言需要不同角色的社区。
他也被他们一年时间创造的“强势品牌”所感染,“我预计 Ola and Ola、Django Girls 将走的很远。”
Python 版本
转换方向,他的下一个疑惑是为什么开发者转向 python 3。“你为什么不能放弃 python 3?”,他设问自己。但他没有说人们应该转移向 python 3,但他也不想他们这样做,但是确实有许多困难的工作需要花费一些其他的东西。例如这些应用和网站的面貌,python 2.7 现在并没有死去,而且会有更多安全修复,或许,接下来的五年将会有更加安全的面貌。移植到 python 3 将有许多繁杂的工作,所以为什么要打扰?
一方面,Python 3是一种要比 Python 2“好得多的语言”。这是一种非常容易教的语言。比如,Django Girls
工作室是完全基于 Python 3 进行开发的。要说 Django
的开发者没有做过基于框架接口的垃圾工作,那从来都是不可能的。这样一来,使用这种语言(和这种框架)使得第一次开发体验更加让人愉快。
随 着时间推移,Python 将变得越来越好。比方,Python 3.5 中有“很多出色的新的东西”。他说,Python 2 是一种优秀的语言并将一如既往地保持着原本的特性,这让它渐渐地向完美的2.7版靠近。要想在核心开发者所做的所有工作中获得益处,唯一办法是转移到 Python 3 中去。
他接下来谈及了即将在 9 月份完成的 Python3.5。他曾经对如此至多的特性无法选择,举个例子来说, os.scandir() 带来的性能优化非常的棒,但实际上大部分的用户并不会注意到。另一部分用户对新的矩阵乘法运算符将会感到非常开心。像 NumPy 和其他的科学计算包将会开始使用这玩意,这个特性将会比调用一个函数来的『自然』多了。
或许他最喜欢的 Python3.5 特性是语法提示 , 也就是他自己做的那个 PEP。为了让 PEP 接受它,他可下了不少功夫,自己做为自己的裁判,说服自己接受自己的工作,这也有点小奇怪。不过他还是希望还是有人来给帮他做一个独立的 Code Review,就像 Mark Shannon 曾经作为 BDFL 代表做过的事情一样,他说。
“如果你对这个也不感到意外的话,上一个 PEP 接受的 Python3.5 特性就是他作为兴趣研究搞的异步与等待关键词。这个将会提供一个更自然的途径去写关于协程的代码。”
GIL
有些听众问到global interpreter lock(GIL),想要更深入了解这个问题,以及这个问题是如何解决的。Van Rossum笑着反问道:“你有多少时间?”他简要的讲述了GIL产生的历史。在Python诞生后,多核计算机出现了。当线程运行在不同的内核中时,两个或更多的处理器要更新同一个对象便产生了竞争机制,特别在Python垃圾回收处理机制中。
一个合理的解决方案就是给每个对象上锁,这样能保护数据不被多路存取破坏。但结果导致当没有锁的竞争时,上锁和解锁操作代价高昂。一些实验表明,不需要上锁的单线程程序性能会因此降低2倍。这意味着只有在使用三个或多个线程或内核的程序会从中获益。
因此,GIL 诞生了(尽管这个名字在它被添加到解释器后很久才出现)。它是一个立刻有效锁定所有对象的单一锁,这样所有对象访问将排序进行。目前的问题是,10年或15年以后,多核处理器无处不在,人们想要不必进行多重处理就可利用它们(例如,使用独立的进程而不是线程通信)
他说,如果你当今想要设计一种新语言,要让它没有易变的对象,或者有限的易变性。然而,听众中传来“这就不是 Python 了”。Van Rossum 赞成的说:“你说出了我要说的话”。GIL 周围有很多开发者不断的努力,包括 PyPy 软件事务内存(STM),以及 PyParallel。其他开发者也撞破了脑袋在想解决办法。如果有人知道有什么办法能够移除 GIL 且让语言保持 Python 特性,Van 和其他人将很乐意听到。
评论删除后,数据将无法恢复
评论(73)
引用来自“Raymin”的评论
关于 GIL,可以学习 JavaScript,Lua,Tcl,它们都没有 GIL!它们都可以在一个进程中,通过多线程,同时运行多个解释器,充分发挥多核的效率。
而 Python 在一个进程内,只能发挥一个 CPU 的效能。
引用来自“鳄鱼的眼泪”的评论
JavaScript,Lua,Tcl都不支持多线程,当然不需要gil。引用来自“Raymin”的评论
你了解有误!引用来自“FBWFBI”的评论
了解有误的是你,语言里面有没有线程,与它的解释器的实现是不是线程安全有毛关系?JavaScript,Lua,Tcl这些语言里面都没有线程的概念,你看过那条js的代码是用来创建线程的? 正是由于语言的代码里面没有涉及多线程的操作,那么这些解释器必然就是线程安全的,因为根本不存在对共享内存加锁访问的问题。CPython里面的GIL,是进程级别的,你在一个进程里面用C来创建多个CPython解释器的实例,当然还是会受到GIL的影响,因为“全局”线程锁!全局是指向整个进程!引用来自“Raymin”的评论
关于 GIL,可以学习 JavaScript,Lua,Tcl,它们都没有 GIL!它们都可以在一个进程中,通过多线程,同时运行多个解释器,充分发挥多核的效率。
而 Python 在一个进程内,只能发挥一个 CPU 的效能。
引用来自“鳄鱼的眼泪”的评论
JavaScript,Lua,Tcl都不支持多线程,当然不需要gil。引用来自“Raymin”的评论
你了解有误!你们想骂人的,自己觉得自己用的语言好,自己爽就行了,还非得管别人用的爽不爽干嘛
哪个语言爽你就用哪个,能不能不要再这么low了
引用来自“雪梨苹果”的评论
osc太多那种不了解语言就去喷的人了,不是程序员就是一堆写手,跟逼乎一一个样。。。。。引用来自“eechen”的评论
个人认为PHP默认不支持多线程的做法是非常正确的,这跟PHP的运行模式有很大关系.因为PHP官方不想因为用户编写的多线程代码的问题而导致Apache崩溃.
而是由Apache和PHP-FPM自身提供的多进程机制来利用多核.
同时提供了一个多线程PECL扩展,方便PHP开发者在CLI下使用多线程.
引用来自“Xiao_f”的评论
php这种没Context的Web技术,注定只能算个高级模版引擎引用来自“eechen”的评论
反对.PHP代表的是FastCGI这种健壮稳定的服务器架构.PHP Session和Yac都能为PHP提供你所谓的Context数据存储.而且PHP基本都是用于进行数据库驱动的Web应用开发,有MySQL作为关系存储,有Memcached/Redis作为内存K/V存储,根本不需要担心跨请求数据共享. CLI下PHP就有你想要表达的Context,典型的如Swoole和WorkerMan应用.引用来自“七液”的评论
你反对个毛线呀,你后面说的东西和PHP有毛关系呀,那是人家本来就有的特性,管你PHP屌事呀,不要总把人家的有点放在PHP上,又不是除了PHP就没有其他语言可以调用MySQL,Memcached,Redis或者K\V的。 看着不知道哪里找来的一些水文就真的以为PHP逆天了。引用来自“我本屠夫”的评论
没必要一句话回复这么多遍引用来自“eechen”的评论
个人认为PHP默认不支持多线程的做法是非常正确的,这跟PHP的运行模式有很大关系.因为PHP官方不想因为用户编写的多线程代码的问题而导致Apache崩溃.
而是由Apache和PHP-FPM自身提供的多进程机制来利用多核.
同时提供了一个多线程PECL扩展,方便PHP开发者在CLI下使用多线程.
引用来自“Xiao_f”的评论
php这种没Context的Web技术,注定只能算个高级模版引擎引用来自“eechen”的评论
反对.PHP代表的是FastCGI这种健壮稳定的服务器架构.PHP Session和Yac都能为PHP提供你所谓的Context数据存储.而且PHP基本都是用于进行数据库驱动的Web应用开发,有MySQL作为关系存储,有Memcached/Redis作为内存K/V存储,根本不需要担心跨请求数据共享. CLI下PHP就有你想要表达的Context,典型的如Swoole和WorkerMan应用.引用来自“七液”的评论
你反对个毛线呀,你后面说的东西和PHP有毛关系呀,那是人家本来就有的特性,管你PHP屌事呀,不要总把人家的有点放在PHP上,又不是除了PHP就没有其他语言可以调用MySQL,Memcached,Redis或者K\V的。 看着不知道哪里找来的一些水文就真的以为PHP逆天了。