84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
最近在写一个 python 多线程读取数据库的程序,只是不知道为什么 python 的多线程和单线程没多大区别,效率也没有提高,而且执行方向也是和单线程一样,请问这是什么问题呢,我用了 threading,自带的 thread 还有 map, 都没用。
走同样的路,发现不同的人生
Python有个GIL这个东西,导致程序每个时候只能有一个线程在运行,所以多线程可能反而会慢,你需要多进程。
编辑补充 @Guangyu 的答案,题主可以考虑用 2.6 引入的 multiprocessing 多进程包
IO密集-->多进程/多线程计算密集-->多进程
Guangyu说的很对,你需要使用多进程才能提高cpu利用率。
C实现的Python中,GIL,也就是全局解释器锁,任何python程序解释执行时都需要它。如果你只开了一个进程,那么不论你有多少个线程,多少个core的cpu,你都只是在time multiplexing,最多使得一个core的利用率接近100%。
除了使用multiprocessing,你也可以使用ctypes这个包,从而在python中调用动态链接库。相当于在C里实现一些功能,然后用python来调用。
Python3.2引入了new GIL,跟原始的GIL的机制有一些显著区别,可以了解一下:New GIL
可以通过gevent变成协程:http://xlambda.com/gevent-tutorial/
gevent
赞同 @richardzhiming
读写数据库主要也在 I/O,大部分时间都在等待 I/O,CPU 的占用时间很少。线程池推荐一个包concurrent.futures,Python 3.2 成了标准库。
concurrent.futures
我去,无意间看到了其他人的答案,感觉很受伤啊,貌似 Python 有了 GIL,多线程就是个废物了,有条件要多反对几次才行。。。
如果是无需同步的事务,强烈推荐使用multiprocessing和multiprocessing.dummy这两个库,分别是多进程和多线程的实现,只需写好事务函数扔到pool.map中,线程分配完全不用自己操心。
Python有个GIL这个东西,导致程序每个时候只能有一个线程在运行,所以多线程可能反而会慢,你需要多进程。
编辑补充 @Guangyu 的答案,题主可以考虑用 2.6 引入的 multiprocessing 多进程包
IO密集-->多进程/多线程
计算密集-->多进程
Guangyu说的很对,你需要使用多进程才能提高cpu利用率。
C实现的Python中,GIL,也就是全局解释器锁,任何python程序解释执行时都需要它。如果你只开了一个进程,那么不论你有多少个线程,多少个core的cpu,你都只是在time multiplexing,最多使得一个core的利用率接近100%。
除了使用multiprocessing,你也可以使用ctypes这个包,从而在python中调用动态链接库。相当于在C里实现一些功能,然后用python来调用。
Python3.2引入了new GIL,跟原始的GIL的机制有一些显著区别,可以了解一下:
New GIL
可以通过
gevent
变成协程:http://xlambda.com/gevent-tutorial/赞同 @richardzhiming
读写数据库主要也在 I/O,大部分时间都在等待 I/O,CPU 的占用时间很少。
线程池推荐一个包
concurrent.futures
,Python 3.2 成了标准库。我去,无意间看到了其他人的答案,感觉很受伤啊,貌似 Python 有了 GIL,多线程就是个废物了,有条件要多反对几次才行。。。
如果是无需同步的事务,强烈推荐使用multiprocessing和multiprocessing.dummy这两个库,分别是多进程和多线程的实现,只需写好事务函数扔到pool.map中,线程分配完全不用自己操心。