Python 多线程有什么好的方案?

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

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


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

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

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

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

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

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

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

赞同 @richardzhiming

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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注