【tulip】 - 多进程的版本
来源:互联网 发布:淘宝店铺被扣了48分 编辑:程序博客网 时间:2024/05/19 02:02
前面的网络编程的例子使用多进程也是可以实现的:
import socketimport osdef main(): listen_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_IP) listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listen_sock.bind(('0.0.0.0', 9090)) listen_sock.listen(0) while True: conn_sock, client_addr = listen_sock.accept() pid = os.fork() if pid == 0: # I am child process serve(conn_sock, client_addr) else: # I am parent process conn_sock.close()def serve(conn_sock, client_addr): print('connected from %s:%s' % client_addr) input = conn_sock.recv(8192) while 'done' != input.strip(): conn_sock.sendall(input) input = conn_sock.recv(8192) conn_sock.sendall('bye!\n') conn_sock.close()main()
其中os.fork()之后会创建一个子进程。子进程默认会继承所有父进程的所有file descriptor(也就包括打开的socket),已经拥有fork前父进程的所有内存状态。所以子进程可以拿着父进程打开的conn_sock继续与客户端通信。而父进程在把conn_sock交给子进程之后,就不再需要开着这个socket的fd了,所以就需要关闭掉。否则,子进程调用conn_sock.close()之后,客户端的连接其实还没有断开,因为父进程还拿着fd不放呢。
从调度的角度来看,前面说的两个要素:
- 状态的保存:仍然是保存在栈上。每个进程都有一个主线程。fork出来的子进程的主线程的栈上保存了对应客户端的conn_sock。
- 不同socket之间的调度:仍然是利用内核的scheduler,只是这次调度的是process。对于内核来说调度逻辑是差不多的,区别就是process还要额外更新一下虚拟内存的映射表,使得多个process彼此之间不可见对方的内存。
从效率上来说,具有多线程一样的问题,而且内存占用会更高,切换成本也更高。多线程和多进程的版本从代码可读性上来说还是非常不错的,很好懂,从上至下平铺直叙的。
0 0
- 【tulip】 - 多进程的版本
- 【tulip】 - 多线程的版本
- 【tulip】 - IOCP
- 进程版本的闹钟
- tcp_server(简单版本,多进程版本,多线程版本)
- Win7下VS2008编译Tulip
- 用户态隐藏进程的通用版本
- 用户态隐藏进程的通用版本
- DDK版本的进程/线程监视器
- 用户态隐藏进程的通用版本
- 用户态隐藏进程的通用版本
- DDK版本的进程/线程监视器
- DDK版本的进程/线程监视器
- 父进程等待子进程的异步版本
- 父进程等待子进程的异步版本
- 简易HTTP服务器(多进程版本)
- python 多进程设置 整理版本1
- 多进程监听同个端口及单进程监听多个端口的php版本实现
- 康托编码
- 【CSS】扁平化,支持IE6的含有方块超级链接的导航栏与含有支持IE8的下拉菜单的导航栏
- 三天打鱼两天晒网
- 【tulip】 - IOCP
- 【tulip】 - 多线程的版本
- 【tulip】 - 多进程的版本
- 【泛融顾问分享】未来银行发展五大趋势
- leetcode挨个儿刷150105(2):Remove Nth Node From End of List
- 【再发福利】ReplaceGoogleCDN:将 Google CDN 替换为国内的 Chrome 插件
- UITextField的详细介绍
- JAVA编程中中如何读取TXT文件数据并计算
- 【协程原理】 - Java中的协程
- arm板子上实现tftp功能
- AFNetworking使用总结 与使用