V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ShiehShieh
V2EX  ›  Python

python 多核 多进程 多线程

  •  
  •   ShiehShieh ·
    ShiehShieh · 2014-12-27 13:47:39 +08:00 · 6990 次点击
    这是一个创建于 3648 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有几个问题我一直不大明白,我说说我的想法,希望大家能指点一下这些认识对不对。

    Python可以利用多核。
    Python的多线程不能利用多核,因为GIL会限制一次只有一个线程。
    Python利用多核的方法之一是根据核心数开相应数量的进程。

    暂时只想到这么多。
    另外希望大家说说python利用多核多线程的一些典型的途径,如果能给个项目参考参考就最好了,或者就是给一个guideline.
    第 1 条附言  ·  2014-12-27 15:13:03 +08:00
    还有就是CPU密集型用多进程,IO密集型用多线程对不对?
    12 条回复    2014-12-27 19:51:50 +08:00
    ryd994
        1
    ryd994  
       2014-12-27 13:54:33 +08:00 via Android
    看你是什么程序了,如果是计算密集那确实Gil限制单线程,不过如果是IO密集的话不成问题,还是可以当多线程用的
    ShiehShieh
        2
    ShiehShieh  
    OP
       2014-12-27 13:55:51 +08:00
    @ryd994 嗯,这个我知道的,python多线程适合IO密集型。
    imn1
        3
    imn1  
       2014-12-27 13:56:02 +08:00
    前两句对,最后一句不对

    没什么好例子,等其他大神
    只玩过多进程调用wget,三句:载入multiprocessing.pool.Pool,一个wget命理的list,然后map()搞定
    imn1
        4
    imn1  
       2014-12-27 13:57:52 +08:00
    切,命令打成命理了
    bigtan
        5
    bigtan  
       2014-12-27 14:02:37 +08:00   ❤️ 3
    http://segmentfault.com/blog/caspar/1190000000414339

    博主可以看看这个,这个很有意思,效果也不错。我在自己的一篇博文里面试过。

    http://segmentfault.com/blog/bigtan/1190000000486961
    yakczh
        6
    yakczh  
       2014-12-27 15:19:09 +08:00
    多线程有GIL
    多进程数据共享和同步麻烦

    只有等协程
    skybr
        7
    skybr  
       2014-12-27 15:34:33 +08:00
    Python的多线程能用到多核, 只要在库里释放GIL锁, 像IO、lxml、numpy之类的都能通过多线程调用多核.
    ShiehShieh
        8
    ShiehShieh  
    OP
       2014-12-27 15:52:29 +08:00
    @skybr 原来如此,怪不得我跑numpy的时候cpu占用会超过100% T-T,但那还是需要人为去释放GIL是吧?默认多线程是无法发挥多核的是吗?
    ShiehShieh
        9
    ShiehShieh  
    OP
       2014-12-27 15:54:18 +08:00
    @bigtan 文章看完了,收获颇丰。谢谢。
    ShiehShieh
        10
    ShiehShieh  
    OP
       2014-12-27 19:27:21 +08:00
    @bigtan 我看了看你的文章,我觉得是因为本身html分析这一部分计算量并不大,主要是IO。
    线程池和进程池都解决了IO阻塞的问题,但是由于本身就不是cpu密集型的任务,所以进程池方法并没有明显的优势。运行时间都在网络下载这些地方了。
    ChanneW
        11
    ChanneW  
       2014-12-27 19:48:16 +08:00   ❤️ 1
    如果用 Go 重写 Python 的解释器, GIL 问题会不会有改善?
    Shared
        12
    Shared  
       2014-12-27 19:51:50 +08:00
    @ChanneW 有很多库依赖 GIL,所以嘛会有更大的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2879 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:32 · PVG 20:32 · LAX 04:32 · JFK 07:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.