最近研究 python 的一个小失落

2016 年 8 月 1 日
 SlipStupig

python 有一个很-O 选项我一直很好奇这个选项是干嘛的, help 写的是:

 -O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x
-OO    : remove doc-strings in addition to the -O optimizations

python 优化选项可以产生更小的 bytecode 文件,我试着选了一下,确实小了一点,但是对性能提升并没有什么用,后来看官方邮件是这么回复的:


> Py_NoSiteFlag = 1...assuming you don't need to load site.py 
>
>     for example:</br>
>
> extern int Py_OptimizeFlag;
> extern int Py_NoSiteFlag;
> ...
> if( !Py_IsInitialized() ) {
>     Py_OptimizeFlag = 2;
>     Py_NoSiteFlag = 1;
>     Py_Initialize();

最后结论是 python 优化选项并没有什么用,想加速换 pypy

33566 次点击
所在节点    Python
268 条回复
xiahei
2016 年 8 月 2 日
实力上演舌战群儒。年度精彩大戏。
jjx
2016 年 8 月 2 日
@Ge4Los

对什么呀, 根本不在点上, 真正做事的 worker 都是阻塞的, 异步协程的作用主要在接入层面,接入更多的请求, 完成依赖于实际做事的 worker, 接入的多, 相应的就部署更多 worker

这帖子完全没有讨论的必要了
serial
2016 年 8 月 2 日
@jjx

你的进程、线程都被 mysql 、 mongodb 阻塞了,还接入更多请求。我问问,你拿什么接入?
Ge4Los
2016 年 8 月 2 日
@jjx 你这算取名问题吧。后端用阻塞服务和接入层本身外用 epoll 异步有啥关系。
接入层和后端之间若用了同步,对外接入用异步 io 也没用啊。
归根结底还是取名字问题。 摊手。
sammiriam
2016 年 8 月 2 日
楼主一不小心搞了个大新,哦不,是大热帖
R4rvZ6agNVWr56V0
2016 年 8 月 2 日
@serial 放一堆链接有啥用,明眼人一看就知道你吐槽的东西根本就不在点子上
首先要搞懂操作系统基本知识、并发、异步基本的东西再辩吧。

不是贴的文字内容越多,越有道理的。
jjx
2016 年 8 月 2 日
@serial

你这句话说的就没有讨论的必要了
R4rvZ6agNVWr56V0
2016 年 8 月 2 日
不管你说啥,俺就一个观点: [ IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧]

没必要把一些库搬出来证明啥,其实啥也证明不了。也麻烦你仔细看俺跟你辩的到底是啥嘛。

ps:在网络上话多措辞强硬有得罪请见谅。希望接下来的辩论,不会让 v2 风气变得太差。
窃以为这种问题帖要学术些、实证些而非诡辩、争吵。伤人不太了。
R4rvZ6agNVWr56V0
2016 年 8 月 2 日
@serial 忘记 at 了
liangmishi
2016 年 8 月 2 日
@GeekGao python web 的初学者从头看到尾最后还是没明白,一直在刷新看看有没有新的回复。请教一下,如果当前请求的数据库查询阻塞了,那是不是其他请求就没办法做查询了?
谢谢
martinsu
2016 年 8 月 3 日
专业程序员 = 专业技工 ?
非专业程序员 = 科学家 ?
serial
2016 年 8 月 3 日
@GeekGao

源代码就在 Github ,自己好好看明白了。

> IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧

这句话暴露了你有多无知。对于你这么无知,我现在给你普及一下,好好学着点,就你这水平,也有脸装:

1. 早期服务器市场,只有多进程 fork exec 。

2. 随着 CPU 技术发展,多线程的许多弊端被解决。多进程 fork 在 Linux 上开销很少,但是对于服务器,多线程开销仍然具备更大优势。 so ,多线程服务器出现,典型代表 Apache tomcat 。

3. Unix 系统开发者提出了 NON_BLOCKING 和循环检测技术,开启非阻塞 IO 技术。但是循环检测是非常低效的,需要每隔一段时间就要占用 CPU 进行检查,哪怕这次什么 IO 都没有。

4. Unix 提出 select 内核检查技术,这是替代 3 的过滤检查技术。 select 首先存储所有需要检查的文件描述符,然后提供一个睡眠,把 CPU 资源返还内核。当有多个 IO 时,内核记录各文件描述符,修改 select 存储的文件描述符, 然后唤醒 select 进程,由进程继续处理。然而, select 仍然存在一个严重问题:唤醒后, select 必须按个检查所有存储的文件描述符,有的可能根本没有 IO ,但是也会进行检查,这就造成 CPU 浪费。两个字:低效。

5. Linux 2.4.3 提出 epoll 内核事件通知技术,这是与 select 完全不一样的轮训技术(之间还出现过 poll 技术)。 epoll 分为边缘通知和水平通知(术语自己查)。首先,与 select 一样,存储所有需要检查的文件描述符,然后提供一个睡眠,把 CPU 资源返还内核。当有 IO 时,内核记录所有有 IO 的文件描述符,并且作为一个返回值返回给 epoll 进程,唤醒 epoll 进程。然后,进程挨个处理所有返回的 IO 文件描述符。差别就在这里: select 检查所有存储的文件描述符,其中有的根本没有 IO ;但是 epoll 不是, epoll 是内核返回所有有 IO 存储过的文件描述符,它们都是有 IO 要求,不存在 CPU 浪费。两个字:高效。

6. FreeBSD 随后跟进,引入了 kqueue 技术,其原理同 epoll 有相似之处。

总结: 当前服务器市场,以 epoll 、 kqueue 为主流,性能最好,并发、吞吐量最高。 服务器主要以单进程 epoll/kqueue (比如 redis )、多进程 epoll/kqueue (比如 nginx )、多线程 epoll/kqueue (比如 netty 库) 为主。对于分布式服务器,如果你不用 epoll/kqueue ,就直接关门倒闭吧。

另外一个领域:关系数据库,由于以磁盘 IO 和锁同步数据安全为主,大多采用多线程同步 IO 。
serial
2016 年 8 月 3 日
@GeekGao

有道理就讲出来,没道理就别 BB 。说一堆无用的废话 P 话,只能显得你很 LOW 。
R4rvZ6agNVWr56V0
2016 年 8 月 3 日
@serial 你 bb 那么多能证明啥,证明你完虐 Python ,怒骂设计不合理 还是你智力有很高? 傻逼
dzhou121
2016 年 8 月 3 日
@serial

GeekGao 说的” IO 阻塞与否跟编程语言没多大关系的“,我觉得是对的呀。

你举的 pymongo , pymysql , docker-py 都是阻塞的也没有错,因为刚好写库的人写成阻塞的了。也可以写基于 twisted, asyncio 的库呀,这样的库不就是非阻塞的了吗。
MySQL 的非阻塞库 https://github.com/aio-libs/aiomysql
Mongo 的非阻塞库 https://github.com/mongodb/motor

再说白了,大多数语言的非阻塞不都是靠库来提供么,标准库也好,第三方库也好。

没有一个语言是万能的,总是根据你项目的需求选择最适合的语言。就说你认为是 toy 的 Wordpress ,一个个人博客的访问量而已,而且要部署方便, php 当然是比较好的选择,用 C 写也太 overkill 了吧。而且你说是 toy ,也只是从技术难度的角度上来说,但是从商业价值上来说, Wordpress 比很多技术难度高于它的项目要高很多吧。

最后说我的结论吧, Python 可以做非 toy 的项目,会遇到这样那样的问题,有坑要绕过去,但是有不用绕坑的编程语言吗?编程语言最终是来解决问题的,选择最适合你的问题的编程语言。
R4rvZ6agNVWr56V0
2016 年 8 月 3 日
@liangmishi
看情况,假设你用的是 mysql ,如果是数据库表死锁了导致的,那么在解锁前你就查不了了。这跟 Python 、 django 框架没啥关系的。
还有种可能就是数据库连接资源被吃光了,无法释放多余的连接给你的 client ,发生这种情况就要找你们的 dba 看下查询提交状态了, kill 掉慢查询或重启……
R4rvZ6agNVWr56V0
2016 年 8 月 3 日
@dzhou121 终于有明白人粗来说话了~ 唉.
honkew
2016 年 8 月 3 日
变成月经贴来争论了
SlipStupig
2016 年 8 月 3 日
@liangmishi 反问一个问题,如果数据库挂了,还能不能读写数据?
YORYOR
2016 年 8 月 3 日
翻页吧 python 慢 这个是事实,为了运维方便 从把 shell 迁到了 python ,之前分钟级别的处理变成了小时级

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/296233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX