如果一个程序需要进行大量的IO操作,应当使用并行还是并发? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Had 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 7798 次点击
    这是一个创建于 2553 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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:0932 +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     Solana     5186 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:30 PVG 15:30 LAX 00:30 JFK 03:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86