【tulip】 - 多线程的版本
来源:互联网 发布:淘宝店铺被扣了48分 编辑:程序博客网 时间:2024/05/24 20:08
上次的网络编程的例子,改写成多线程的是这样:
import socketimport threaddef 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() thread.start_new(serve, (conn_sock, client_addr))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()
变成多线程之后,就可以有多个客户端同时连接到服务器并同时进行服务了。最重要的是每个线程,对应了一个“serve”函数的执行。所以函数执行就是有一个函数的栈,栈上有一个函数的参数和局部变量。最重要的一个局部变量就是conn_sock,有了这个socket就可以和对应的客户端进行对话。
机器都有一个ESP的寄存器指向函数的栈顶所在的内存地址。一个cpu核只有一个ESP寄存器。有多个线程同时执行的时候,每个线程的状态是由操作系统内核负责保存在内存中的。当这个线程被调度为执行状态的时候,ESP寄存器被切换为当前线程的栈顶位置,然后继续执行这个线程的后面的指令。服务器可以支持多个客户端,就有两个关键的问题要解决:
- 保存每个客户端的服务状态(最起码要保存对应这个客户端的socket)
- 一个全局scheduler来负责I/O,在需要的时候把客户端对应的状态切换为“当前活跃”状态。在线程调用了阻塞的I/O操作时,操作系统内核就把线程给挂起了,同时在映射表里记录一个对应关系,哪个I/O阻塞的fd对应的是哪个线程在等待它。等I/O阻塞条件满足了,对应的线程就会被查表得到然后被唤醒。
在多线程的实现中。每个客户端的状态就是保存在线程对应函数的栈上的,而全局的scheduler就是内核的线程scheduler。这种实现方式最大的缺点是线程的栈是创建时预先分配的很大的一块区域,大量线程会耗费过度内存。并且内核的线程scheduler在切换多个线程的时候,线程切换的开销是比较大。
0 0
- 【tulip】 - 多线程的版本
- 【tulip】 - 多进程的版本
- 【tulip】 - IOCP
- 多线程版本的RunTime Library
- Win7下VS2008编译Tulip
- 什么是C Runtime函数库的多线程版本
- C Runtime 函数库的多线程版本
- 什么是C Runtime函数库的多线程版本
- 5.3版本mongoose的多线程实例源代码
- 多线程下载的写法,java版本
- Cocos笔记_Cocos3.0+版本的多线程
- .net各个版本多线程的进化
- 多线程版本的User_KNN的C语言实现
- 多线程版本的Item_KNN的C语言实现
- C runtime 函数库的多线程版本(转载)
- 使用交叉编译环境编译支持多线程的x264版本
- Double Checked Locking 模式 -- 单例实现的多线程版本
- socket通信之四:多线程版本的客户/服务器模型
- apue学习第九天——标准I/O库(第五章)
- 康托编码
- 【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功能