到底并行程序,用的是多线程还是多进程

ludongxing
ludongxing 01月16日 字数 131

比如说,nginx的并发能力特别强,到底并发能力强指的是多线程还是多进程?

另外多进程和多线程的区别是什么?到底应该用多进程还是用多线程?

Programming 编程技术
16 个回复
hgoldfish
老鱼 01月16日

并发,并行。。不是一个概念。

前者一般是指同时处理多个 IO,后者指同时进行多个计算。

【 在 ludongxing (ludongxing) 的大作中提到: 】

: 比如说,nginx的并发能力特别强,到底并发能力强指的是多线程还是多进程?

: 另外多进程和多线程的区别是什么?到底应该用多进程还是用多线程?

wjhtingerx
ca6140 01月16日

并发&并行是一个业务概念,多线程&多进程是实现方式,至于线程进程区别,你需要从基础学起了

【 在 ludongxing 的大作中提到: 】

: 比如说,nginx的并发能力特别强,到底并发能力强指的是多线程还是多进程?

: 另外多进程和多线程的区别是什么?到底应该用多进程还是用多线程?

zli07
Anonymous 01月16日

nginx 的并发高,靠的是异步 io,也就是 io 不会等待,实际上它是单线程+多进程模式:首先有个 master process,解析配置文件,然后根据配置 fork 出 n 个 worker process, 当客户端连接过来的时候,会有某一个 worker process 处理这个连接的请求,同时由于异步 io 的机制,一个进程可以同时处理很多个(成千上万)用户的请求。

z16166
Netguy 01月16日

多进程容错能力强一些(可用性),一个进程崩了,不会影响其他进程;如果只有多线程而没有多进程,只要有一个崩了,就全崩了。

Nginx作为网络服务,高可用性是必须的。

网络服务端的话,尽可能利用SO_REUSEPORT,针对同一个端口开多个socket,用多个线程/进程去执行accept(),提高accept()的速度。

lokta
部落 01月16日

并发是并发,并行是并行,这个但凡是讲多线程编程的书都会强调。

并发是单位时间内同时处理任务的数量。

并行是真是有多个核/机器在跑。

多线程能否利用多核跑取决于语言的机制。

比如java,erlang的虚拟机就可以多线程跑在多个核上。

python受限制于gil就只能跑在一个核心上。

所以拼极限性能的时候就不行了,但是也不是没有补救的办法,比如gunicorn可以通过跑多个核心来充分利用。

【 在 ludongxing (ludongxing) 的大作中提到: 】

: 比如说,nginx的并发能力特别强,到底并发能力强指的是多线程还是多进程?

: 另外多进程和多线程的区别是什么?到底应该用多进程还是用多线程?

billybear04
billybear04 01月16日

首先赞楼上的技术性,其次我也说两句呗。

比如说有1000个client连到你的server,就有1000个socket要处理(刨掉listen的不算)。在程序里recv或者read下,如果对面没有数据,是怎样的情况?

如果没数据recv就不返回,这叫阻塞方式。那么recv(skt_1)阻塞住了,skt_2有数据怎么办?单进程就没法处理了。如果没数据recv返回个特殊标志,这叫非阻塞,你可以轮着询问(轮询,不是gang rape:-))各个socket,这样CPU狂转,效率不高。

多进程方式可以每个进程干一个socket,如果socket很多,比如C10K, C100K,进程太多了,而且创建/销毁进程很耗资源。

线程比进程轻量,但是地址空间不隔离,方便是方便,但一个线程出错可能破坏另一个线程的数据,不好调试。

linux的epoll,你可以声明说我对n个socket的状况感兴趣,然后epoll_wait,如果没事,操作系统的内核可以去干别的事,你的程序阻塞。如果至少一个有事,它会返回,你可以知道哪些有事,进行相应处理。这样单进程单线程程序也能用。古早的Windows下可以用消息队列。

但是CPU多个核,一核忙着其它围观?或者别着我不懂的原因,多进程/线程可以再和epoll结合起来,比如56个核56个线/进程,每个处理若干个socket。56个民族56朵花,56个进程端口是一家,它们的能力汇成一句话,连吧连吧来连吧。

lighttpd应该也值得一看。

lushan5436
密如 01月16日

多个accept和单个accept都有,好多都是单accept然后多个进程/线程去处理

【 在 z16166 的大作中提到: 】

: 多进程容错能力强一些(可用性),一个进程崩了,不会影响其他进程;如果只有多线程而没有多进程,只要有一个崩了,就全崩了。

: Nginx作为网络服务,高可用性是必须的。

: 网络服务端的话,尽可能利用SO_REUSEPORT,针对同一个端口开多个socket,用多个线程/进程去执行accept(),提高accept()的速度。

stub
stub 01月16日

epoll这种是不是需要手动修改linux中对进程中文件描述符的限制

【 在 zli07 的大作中提到: 】

: nginx 的并发高,靠的是异步 io,也就是 io 不会等待,实际上它是单线程+多进程模式:首先有个 master process,解析配置文件,然后根据配置 fork 出 n 个 worker process, 当客户端连接过来的时候,会有某一个 worker process 处理这个连接的请求,同时由于异步 io 的机制,一个进程可以同时处理很多个(成千上万)用户的请求。

stub
stub 01月16日

这个需要是linux吧,并且还不能太老的内核,别的系统好像不支持?

【 在 z16166 的大作中提到: 】

: 多进程容错能力强一些(可用性),一个进程崩了,不会影响其他进程;如果只有多线程而没有多进程,只要有一个崩了,就全崩了。

: Nginx作为网络服务,高可用性是必须的。

: 网络服务端的话,尽可能利用SO_REUSEPORT,针对同一个端口开多个socket,用多个线程/进程去执行accept(),提高accept()的速度。

hoodlum
hoodlum 01月16日

一般这个领域都研究的是同一个进程内的多线程。

因为是处在同一个进程空间里,涉及到资源的访问等。

所以这里有一些学问。

进程和进程之间是隔离的,所以说多进程基本上没啥

值得研究的。

一般这个方向上就是问你进程和进程之间如何通讯。

【 在 ludongxing (ludongxing) 的大作中提到: 】

: 比如说,nginx的并发能力特别强,到底并发能力强指的是多线程还是多进程?

: 另外多进程和多线程的区别是什么?到底应该用多进程还是用多线程?

z16166
Netguy 01月16日

Linux kernel 3.9+

【 在 stub 的大作中提到: 】

: 这个需要是linux吧,并且还不能太老的内核,别的系统好像不支持?

stub
stub 01月16日

用epoll做高并发是不是要手动修改操作系统单进程中文件描述符数量限制

【 在 z16166 的大作中提到: 】

: Linux kernel 3.9+

z16166
Netguy 01月16日

这个不是epoll独有的问题吧。连接数大的话,用别的API也会有这个问题,也得改。

限制epoll自己的watch数目的是/proc/sys/fs/epoll/max_user_watches

【 在 stub 的大作中提到: 】

: 用epoll做高并发是不是要手动修改操作系统单进程中文件描述符数量限制

stub
stub 01月16日

感谢

【 在 z16166 的大作中提到: 】

: 这个不是epoll独有的问题吧。连接数大的话,用别的API也会有这个问题,也得改。

: 限制epoll自己的watch数目的是/proc/sys/fs/epoll/max_user_watches

stub
stub 01月16日

另外也需要修改进程文件描述符数量限制吧,否则,文件描述符数量限制比较小,epoll watch设置的大也没意义

【 在 z16166 的大作中提到: 】

: 这个不是epoll独有的问题吧。连接数大的话,用别的API也会有这个问题,也得改。

: 限制epoll自己的watch数目的是/proc/sys/fs/epoll/max_user_watches

z16166
Netguy 01月16日

对的

【 在 stub 的大作中提到: 】

: 另外也需要修改进程文件描述符数量限制吧,否则,文件描述符数量限制比较小,epoll watch设置的大也没意义