V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Registering
V2EX  ›  Android

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

  •  1
     
  •   Registering · 2015-11-06 13:57:08 +08:00 · 14123 次点击
    这是一个创建于 3330 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天面试基础的问题,算法等都回答得 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   ·   实用小工具   ·   3205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:30 · PVG 20:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.