什么场景下你们会用多进程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Registering
V2EX    Android

什么场景下你们会用多进程

  •  1
     
  •   Registering 2015-11-06 13:57:08 +08:00 17283 次点击
    这是一个创建于 3694 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天面试基础的问题,算法等都回答得 OK ,多进程知识点用的比较少,回来准备恶补恶补。

    大家平时使用多进程一般都在哪些场景下使用,,

    昨天面试官说如果打开一张大图,可以考虑在一个单独的进程中打开
    第 1 条附言    2015-11-06 14:49:46 +08:00
    主要针对 android 开发
    32 条回复    2015-12-12 17:36:53 +08:00
    c24c4fe8
        1
    c24c4fe8  
       2015-11-06 14:03:55 +08:00
    就是需要处理的信息提供得太慢,导致 cpu 性能没有充分利用,这个时候多进程能充分利用 cpu
    bengol
        2
    bengol  
       2015-11-06 14:11:24 +08:00
    @c24c4fe8 既然需要的信息提供的太慢,那么利用多进程以充分利用 CPU 来处理什么东西呢?
    SYP
        3
    SYP  
       2015-11-06 14:16:20 +08:00 via Android
    多核利用率还有异步的时候,基本和线程一样,只是同步代价大一些。
    qw7692336
        4
    qw7692336  
       2015-11-06 14:26:36 +08:00
    什么时候该用多线程,什么时候该用多进程?
    wsy2220
        5
    wsy2220  
       2015-11-06 14:34:03 +08:00
    多进程崩一个进程不影响其他的进程
    harry890829
        6
    harry890829  
       2015-11-06 14:36:47 +08:00
    公司服务器现在用的是多线程构架,我准备全都改成多进程……使用共享内存来同步数据,要不然一个地方出现问题,整个就崩溃了,这个挺重要的,你当时应该问他,起进程处理图,为什么不起线程?
    caliy
        7
    caliy  
       2015-11-06 14:37:43 +08:00
    多进程大都在多任务并行,比如浏览器标签页,好处是互相独立,一个崩溃不影响其他,缺点是占用系统资源多,吃性能,大图的话当然单个进程,多进程有可能卡死,而且性能浪费
    webjin
        8
    webjin  
       2015-11-06 14:42:03 +08:00 via Android
    进程不够用的时候
    a0000
        9
    a0000  
       2015-11-06 14:51:48 +08:00 via Android
    @bengol 比如说同构数据处理,如果量大的话就可以考虑多线程,这个慢只是相对的。利用多线程可以提高 CPU 吞吐率。吞吐率上去了,整体的速度也就上去了
    a0000
        10
    a0000  
       2015-11-06 14:54:53 +08:00 via Android
    Android 开发好像就网络请求用到了多线程,其他的还没有碰到需求场景
    不过有的场景可以利用 ExecutorService 线程服务框架来解决问题
    hcymk2
        11
    hcymk2  
       2015-11-06 14:57:28 +08:00
    java 基本用不到多进程吧。
    你说的是多线程吧
    Registering
        12
    Registering  
    OP
       2015-11-06 14:57:40 +08:00
    @a0000 进程,进程,,不是说线程
    Registering
        13
    Registering  
    OP
       2015-11-06 14:58:06 +08:00
    @hcymk2 android 使用多进程确实不少
    a0000
        14
    a0000  
       2015-11-06 14:59:44 +08:00 via Android
    @Registering 额,多进程就不知道了
    sunpj
        15
    sunpj  
       2015-11-06 15:15:14 +08:00
    多进程主要用来做各种黑科技。。比如双进程有个进程在后台保持长连接来监听推送,还有就是双进程防杀这种。。还有些就是当做公共的组件 比如阿里有个单点登录 意思是比如你登录过淘宝,你打开淘点点这种阿里系的 app 就不用登录,也是有个后台进程常驻的
    Bown
        16
    Bown  
       2015-11-06 15:22:21 +08:00
    一般场景都是用作守护吧,比如一个 app 具有 hotfix 的功能,但是因为某次 hotfix 导致 crash 了,这时需要再发布一次 patch 修复这个问题,可如果 crash 发生在启动时,那么 hotfix 自身就无法启动来使用新 patch 来修复,这时把 hotfix 单独放在一个进程就可以解决了
    br00k
        17
    br00k  
       2015-11-06 16:51:22 +08:00
    @Bown 用来刷流氓
    rebbie
        18
    rebbie  
       2015-11-06 17:53:42 +08:00
    @harry890829 如果有共享的数据,那其实是不建议起进程的,一个进程挂掉同样会污染共享内存。如果共享通信的话,就还好
    allan1st
        19
    allan1st  
       2015-11-06 18:20:19 +08:00
    有些内存泄露的时候,比如说有段时间 LeakCanary 报 VideoView 和 WebView 泄露,那么有关页面用单独 process 然后用完直接杀掉。
    em70
        20
    em70  
       2015-11-06 18:45:59 +08:00 via Android
    任何网络请求都要放线程,否则 app 质量就不过关,因为用户环境很复杂,请求可能卡死
    domty
        21
    domty  
       2015-11-06 19:06:16 +08:00
    某部分操作相对比较耗时又可以从主流程分离的时候
    比如用爬虫爬数据的时候我都习惯让爬虫把数据扔个缓存队列里
    然后让一个单独线程持有数据库连接并且把数据入库
    allan1st
        22
    allan1st  
       2015-11-06 19:17:00 +08:00
    @em70 说的是进程( process )
    hqs123
        23
    hqs123  
       2015-11-06 23:33:57 +08:00
    开发中想用就用把...
    CodeCaker
        24
    CodeCaker  
       2015-11-06 23:38:38 +08:00 via Android
    我怎么第一个想到的是 chrome 呢?一个标签页挂掉还能继续活着。
    yrom
        25
    yrom  
       2015-11-06 23:56:28 +08:00
    比如音乐播放、大文件下载。。。都可以多进程
    Victor215
        26
    Victor215  
       2015-11-06 23:59:52 +08:00 via Android
    比如说存在 GIL 的时候……
    harry890829
        27
    harry890829  
       2015-11-07 10:24:04 +08:00
    @rebbie 但是如果不用共享内存的话,在数据共享的时候还是会有点问题啊……
    glogo
        28
    glogo  
       2015-11-07 19:52:17 +08:00
    用 python 的时候就想用多进程...
    yuriko
        29
    yuriko  
       2015-11-09 15:33:42 +08:00
    Android 的话因为大量行为的发起方都在主线程,所以一旦碰到长时间操作都要另开线程,比如联网、数据库等等,不然就报 ANR
    Registering
        30
    Registering  
    OP
       2015-11-09 20:02:49 +08:00
    @yuriko 进程,进程,,不是线程
    yuriko
        31
    yuriko  
       2015-11-10 08:00:18 +08:00
    @Registering 你都说了是 android 开发了,我才从 android 角度和你讨论这个问题,你结果却和我说线程和进程的区别, android 对进程已经封装了,你见过 android 没事在不同进程上开发么(虽然的确是有的)?
    而且,从上下文来看,面试官说的显然是想说线程的,要解决的是异步问题而不是后天进程管理的问题。
    a0000
        32
    a0000  
       2015-12-12 17:36:53 +08:00
    @yuriko 嗯,感觉你没有 get 到楼主的需求。不知道面试官说的“显然”是想说线程的,这个“显然”的结论是怎么得出来的。

    实力有限,不明白面试官问题的意图是什么,为啥不开始的时候问下他呢,也当学习了

    确实是有场景是需要另开进程的,只不过平时自己工作中没有碰上这种场景

    最近在做定位的功能,要在后台一直定位,但是很容易被系统杀死,所以在找解决 service 保活的方案,查到了下面这篇文章,就提到了另开进程保活推送服务。

    在 Android 系统中, App 对于自己应用的生命周期是基本没有控制力,系统能在任意时候将你的进程杀死,且不会发出任何通知,也会在它认为合适的时候把你叫起来。进程前后台切换也同样不会给出任何通知。不过进程的生死控制也还是有一些规矩的,大体上来说就是进程占的资源越多(内存, CPU 时间等等),对于用户越不重要(前台进程->可视进程->服务进程->后台进程->空进程),越容易被干掉。因此,进程应当尽量小巧,且具有高的优先级。
    如果一个应用本身就很小巧的话,一个进程就完全足够了,主线程负责 UI ,另起一个后台线程跑一个服务。而如果应用比较庞大的话,将推送服务独立出来则是一个更好的选择。主进程负责用户交互和主要的业务逻辑,占用庞大的资源,当退到后台后,随时被杀死都无所谓。推送进程则仅仅负责与服务器交互,保持最小限度的业务逻辑处理。
    引用: http://zhoujianghua.com/2015/09/20/summary_of_im_android/
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2833 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 00:21 PVG 08:21 LAX 16:21 JFK 19:21
    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