Python 多线程有什么好的方案?
怪我咯
怪我咯 2017-04-17 16:13:08
[Python讨论组]

最近在写一个 python 多线程读取数据库的程序,只是不知道为什么 python 的多线程和单线程没多大区别,效率也没有提高,而且执行方向也是和单线程一样,请问这是什么问题呢,我用了 threading,自带的 thread 还有 map, 都没用。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(6)
怪我咯

Python有个GIL这个东西,导致程序每个时候只能有一个线程在运行,所以多线程可能反而会慢,你需要多进程。


编辑补充 @Guangyu 的答案,题主可以考虑用 2.6 引入的 multiprocessing 多进程包

PHPz

IO密集-->多进程/多线程
计算密集-->多进程

PHP中文网

Guangyu说的很对,你需要使用多进程才能提高cpu利用率。

C实现的Python中,GIL,也就是全局解释器锁,任何python程序解释执行时都需要它。如果你只开了一个进程,那么不论你有多少个线程,多少个core的cpu,你都只是在time multiplexing,最多使得一个core的利用率接近100%。

除了使用multiprocessing,你也可以使用ctypes这个包,从而在python中调用动态链接库。相当于在C里实现一些功能,然后用python来调用。

Python3.2引入了new GIL,跟原始的GIL的机制有一些显著区别,可以了解一下:
New GIL

ringa_lee

可以通过gevent变成协程:http://xlambda.com/gevent-tutorial/

大家讲道理

赞同 @richardzhiming

读写数据库主要也在 I/O,大部分时间都在等待 I/O,CPU 的占用时间很少。
线程池推荐一个包 concurrent.futures,Python 3.2 成了标准库。

我去,无意间看到了其他人的答案,感觉很受伤啊,貌似 Python 有了 GIL,多线程就是个废物了,有条件要多反对几次才行。。。

大家讲道理

如果是无需同步的事务,强烈推荐使用multiprocessing和multiprocessing.dummy这两个库,分别是多进程和多线程的实现,只需写好事务函数扔到pool.map中,线程分配完全不用自己操心。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号