Python 多线程有什么好的方案?
怪我咯
怪我咯 2017-04-17 16:13:08
0
6
428

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

怪我咯
怪我咯

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

reply all (6)
刘奇

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


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

    PHPzhong

    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中,线程分配完全不用自己操心。

              Latest Downloads
              More>
              Web Effects
              Website Source Code
              Website Materials
              Front End Template
              About us Disclaimer Sitemap
              php.cn:Public welfare online PHP training,Help PHP learners grow quickly!