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