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
wangtianshang
V2EX  ›  Python

如果一个程序需要进行大量的 IO 操作,应当使用并行还是并发?

  •  
  •   wangtianshang · 2018-11-04 14:57:14 +08:00 via Android · 7367 次点击
    这是一个创建于 2245 天前的主题,其中的信息可能已经有所发展或是发生改变。
    36 条回复    2018-11-06 20:00:45 +08:00
    HuHui
        1
    HuHui  
       2018-11-04 15:00:04 +08:00
    看具体业务
    wmhx
        2
    wmhx  
       2018-11-04 15:03:04 +08:00
    并行 /并发 有什么区别?
    lhx2008
        3
    lhx2008  
       2018-11-04 15:08:31 +08:00 via Android
    异步
    lean
        4
    lean  
       2018-11-04 15:09:32 +08:00 via Android
    @wmhx 并行:生产流水线
    并发:购物订单
    misaka19000
        5
    misaka19000  
       2018-11-04 15:10:40 +08:00
    并行还是并发不看 IO,要看计算量大不大
    WildCat
        6
    WildCat  
       2018-11-04 15:17:41 +08:00
    揭秘 iPhone 售后的灰色产业链,是什么让苹果每年损失十多亿美元
    https://zhuanlan.zhihu.com/p/46463952

    「据外媒 The Information 统计,苹果在 2013 年用于全球售后维修的预算为 16 亿美元,但最终花了 37 亿美元来维持业务运营,而中国市场的售后处理占了业务支出的大头。」
    WildCat
        7
    WildCat  
       2018-11-04 15:17:52 +08:00
    @WildCat 楼上发错了 抱歉!
    opengps
        8
    opengps  
       2018-11-04 16:29:49 +08:00
    并行 /并发 是不是这么理解:
    并行,多进程甚至多服务器
    并发,单进程多线程

    对于将来需要扩展的业务,显然必然选择多进程多服务器这种“分布式”,对于仅仅需要多几个线程充分用满当前 cpu,则并发多线程去运行
    mattx
        9
    mattx  
       2018-11-04 16:30:25 +08:00
    io 的瓶颈在于磁盘, 网卡等, 无法真正的并行, 即使调用上的并发量上去了, 效果也挺差的. 用异步的方式来解决, 降低消耗.
    leriou
        10
    leriou  
       2018-11-04 16:42:03 +08:00
    @wmhx 并行可类比为 2 个人同时去一台饮水机的两个出水口接水, 两个人一个要热水,一个要凉水, 并发类比两个人一起去都要热水
    zjsxwc
        11
    zjsxwc  
       2018-11-04 16:48:04 +08:00 via Android
    一张嘴同时说中午与英文是并行;说一句中午再说一句英文是并发。
    xmadi
        12
    xmadi  
       2018-11-04 16:55:45 +08:00 via iPhone
    这种咬文嚼字没有意义
    qhxin
        13
    qhxin  
       2018-11-04 17:26:06 +08:00
    erlang 解决烦劳
    likuku
        14
    likuku  
       2018-11-04 17:37:32 +08:00
    猜你实际上是想问密集 I/O 时 Python 用 多进程 or 多线程?

    假若是问这个,两个都行啊。CPU 密集,则只得用多进程。
    kekxv
        15
    kekxv  
       2018-11-04 17:51:38 +08:00 via Android
    应当用 redis 等玩意
    henglinli
        16
    henglinli  
       2018-11-04 18:02:03 +08:00
    有兴趣可以看看这个,https://sites.google.com/site/1024cores/。 这个人设计了 golang scheduler (我估计 golang 现在任然是这个 scheduler ) https://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw/edit
    我当时只是想看看 lockfree 的,可能你对 Scalable Architecture 这部分更感兴趣。
    站在我的水平上,我的意见是并发能达到需求,就不考虑并行。越往底层走,越难 handle,当然也越有意思。
    ltoddy
        17
    ltoddy  
       2018-11-04 18:08:54 +08:00   ❤️ 2
    并发是指一次处理多件事。

    并行是指一次做多件事。

    二者不同,但是有联系。

    一个关于结构,一个关于执行。

    并发用于制定方案,用来解决可能(但未必)并行的问题。

    -- Rob Pike Go 语言的创造者之一

    我自己想法是多线程+异步.
    zxiso
        18
    zxiso  
       2018-11-04 18:10:01 +08:00 via Android
    大量 io 最好可以通过异步流程,分离 io 部分和逻辑部分。因为整体 io 耗时就摆在那里。。逻辑部分可以做点进度条之类的东西让用户感觉良好就好。。
    feverzsj
        19
    feverzsj  
       2018-11-04 18:10:47 +08:00
    都可以
    qwe61655
        20
    qwe61655  
       2018-11-04 19:25:46 +08:00 via iPhone
    看情况
    blackjar
        21
    blackjar  
       2018-11-04 20:13:19 +08:00
    这两个冲突吗? 多进程+协程
    inframe
        22
    inframe  
       2018-11-04 23:33:57 +08:00 via iPhone
    看起来是 concurrency 和 parallel 的关系
    ArianX
        23
    ArianX  
       2018-11-05 00:21:49 +08:00 via Android
    我一直觉得并行是并发的一种方式
    JCZ2MkKb5S8ZX9pq
        24
    JCZ2MkKb5S8ZX9pq  
       2018-11-05 00:44:09 +08:00
    网络 IO 多开可能提速,硬盘 IO 能提速嘛?
    jimzhong
        25
    jimzhong  
       2018-11-05 01:22:09 +08:00
    @ArianX 反了吧
    glacer
        26
    glacer  
       2018-11-05 01:32:53 +08:00
    并发就是假的并行...
    并行是指多核情况下同时处理多任务,并发是在单核下利用时间片来模拟同时处理多任务。
    glacer
        27
    glacer  
       2018-11-05 01:34:35 +08:00
    回答楼主问题。IO 密集型的程序使用多线程或线程并发即可,这种情况下能最大化利用 CPU。
    sl0000
        28
    sl0000  
       2018-11-05 08:40:24 +08:00
    这个应该使用并法逻辑流的 I/O 多路复用
    checgg
        29
    checgg  
       2018-11-05 09:03:16 +08:00
    这是啥问题?
    并行和并发的定义是啥,不理解,能否补充一下英文关键词或者具体业务场景?
    大量 IO 是指的磁盘 IO 还是网络 IO ?
    liuminghao233
        30
    liuminghao233  
       2018-11-05 09:03:42 +08:00 via iPhone
    异步加协程最好了
    Antihank
        31
    Antihank  
       2018-11-05 09:17:41 +08:00
    并发是场景,并行是方法,你怎么并发 IO ?
    xmge
        32
    xmge  
       2018-11-05 10:01:39 +08:00
    并行
    dychenyi
        33
    dychenyi  
       2018-11-05 10:08:46 +08:00
    我做过, 多线程+mmap
    lolizeppelin
        34
    lolizeppelin  
       2018-11-05 13:38:32 +08:00 via Android
    看情况 io 上限摆在那里 极限情况下并行并不能超过物理上限
    反而因为大量上下文切换降低性能

    你试试 多个大量数据的 SQL 文件并行插入 结果插入速度远低于顺序执行这些 sql 文件


    但是多个少量 sql 文件 并行插入性能就不错

    所以 看情况
    xiangbohua
        35
    xiangbohua  
       2018-11-05 21:13:07 +08:00
    中间层缓冲,统一 IO 进磁盘,随机 IO 真的废
    wangtianshang
        36
    wangtianshang  
    OP
       2018-11-06 20:00:45 +08:00 via Android
    @glacer 是的😁
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:06 · PVG 21:06 · LAX 05:06 · JFK 08:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.