素材牛VIP会员
Python 多线程有什么好的方案?
 gu***yu  分类:Python  人气:951  回帖:6  发布于6年前 收藏

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

 标签:多线程python

讨论这个帖子(6)垃圾回帖将一律封号处理……

Lv6 码匠
无***圣 职业无 6年前#1

赞同 @richardzhiming

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

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

Lv6 码匠
st***en 交互设计师 6年前#2

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

Lv7 码师
你***擦 Linux系统工程师 6年前#3

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

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

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

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

Lv6 码匠
轩***室 学生 6年前#4

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

Lv3 码奴
wj***37 页面重构设计 6年前#5

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


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

Lv4 码徒
黑***人 JS工程师 6年前#6

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取