多进程

import socket
import re
import multiprocessingdef service_client(new_socket):"""为这个客户端返回数据"""# 1. 接收浏览器发送过来的请求 ,即http请求  # GET / HTTP/1.1# .....request = new_socket.recv(1024).decode("utf-8")# print(">>>"*50)# print(request)request_lines = request.splitlines()print("")print(">"*20)print(request_lines)# GET /index.html HTTP/1.1# get post put delfile_name = ""ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])if ret:file_name = ret.group(1)# print("*"*50, file_name)if file_name == "/":file_name = "/index.html"# 2. 返回http格式的数据,给浏览器try:f = open("./html" + file_name, "rb")except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found-----"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 2.1 准备发送给浏览器的数据---headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"# 2.2 准备发送给浏览器的数据---boy# response += "hahahhah"# 将response header发送给浏览器new_socket.send(response.encode("utf-8"))# 将response body发送给浏览器new_socket.send(html_content)# 关闭套接new_socket.close()def main():"""用来完成整体的控制"""# 1. 创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2. 绑定tcp_server_socket.bind(("", 7890))# 3. 变为监听套接字tcp_server_socket.listen(128)while True:# 4. 等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()# 5. 为这个客户端服务p = multiprocessing.Process(target=service_client, args=(new_socket,))p.start()new_socket.close()# 关闭监听套接字tcp_server_socket.close()if __name__ == "__main__":main()

多线程

import socket
import re
import threadingdef service_client(new_socket):"""为这个客户端返回数据"""# 1. 接收浏览器发送过来的请求 ,即http请求  # GET / HTTP/1.1# .....request = new_socket.recv(1024).decode("utf-8")# print(">>>"*50)# print(request)request_lines = request.splitlines()print("")print(">"*20)print(request_lines)# GET /index.html HTTP/1.1# get post put delfile_name = ""ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])if ret:file_name = ret.group(1)# print("*"*50, file_name)if file_name == "/":file_name = "/index.html"# 2. 返回http格式的数据,给浏览器try:f = open("./html" + file_name, "rb")except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found-----"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 2.1 准备发送给浏览器的数据---headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"# 2.2 准备发送给浏览器的数据---boy# response += "hahahhah"# 将response header发送给浏览器new_socket.send(response.encode("utf-8"))# 将response body发送给浏览器new_socket.send(html_content)# 关闭套接new_socket.close()def main():"""用来完成整体的控制"""# 1. 创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2. 绑定tcp_server_socket.bind(("", 7890))# 3. 变为监听套接字tcp_server_socket.listen(128)while True:# 4. 等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()# 5. 为这个客户端服务p = threading.Thread(target=service_client, args=(new_socket,))p.start()# new_socket.close()# 关闭监听套接字tcp_server_socket.close()if __name__ == "__main__":main()

gevent协程

import socket
import re
import gevent
from gevent import monkeymonkey.patch_all()def service_client(new_socket):"""为这个客户端返回数据"""# 1. 接收浏览器发送过来的请求 ,即http请求  # GET / HTTP/1.1# .....request = new_socket.recv(1024).decode("utf-8")# print(">>>"*50)# print(request)request_lines = request.splitlines()print("")print(">"*20)print(request_lines)# GET /index.html HTTP/1.1# get post put delfile_name = ""ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])if ret:file_name = ret.group(1)# print("*"*50, file_name)if file_name == "/":file_name = "/index.html"# 2. 返回http格式的数据,给浏览器try:f = open("./html" + file_name, "rb")except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found-----"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 2.1 准备发送给浏览器的数据---headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"# 2.2 准备发送给浏览器的数据---boy# response += "hahahhah"# 将response header发送给浏览器new_socket.send(response.encode("utf-8"))# 将response body发送给浏览器new_socket.send(html_content)# 关闭套接new_socket.close()def main():"""用来完成整体的控制"""# 1. 创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2. 绑定tcp_server_socket.bind(("", 7890))# 3. 变为监听套接字tcp_server_socket.listen(128)while True:# 4. 等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()# 5. 为这个客户端服务gevent.spawn(service_client, new_socket)# new_socket.close()# 关闭监听套接字tcp_server_socket.close()if __name__ == "__main__":main()

使用多进程、多线程、gevent完成http服务器相关推荐

  1. TCP-实现英译汉服务器客户端(多进程/多线程)

    TCP套接字编程介绍 本文程序介绍(共5部分) TCP API 封装 Socket() 创建套接字 Close() 关闭套接字 Bind() 绑定地址信息 Listen() 使一个套接字成为监听套接字 ...

  2. linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...

    基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF 第 卷 第 期 电子设计工程 年 月 基于 的多线程池并发 服务器设计 陈 涛 任海兰 武汉邮电科学研究院 湖北 武汉 摘要 时至今 ...

  3. linux 多进程 多线程的选择

    关于多进程和多线程,教科书上最经典的一句话是"进程是资源分配的最小单位,线程是CPU调度的最小单位",这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了 ...

  4. 浅谈多进程多线程的选择(转)

    关于多进程和多线程,教科书上最经典的一句话是"进程是资源分配的最小单位,线程是CPU调度的最小单位",这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了 ...

  5. 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2

    并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等 目录 1. "共享内存系统",消息传递系统". 1 1.1. 共享模式 多进程 多线程 1 1.2. Ac ...

  6. 多进程多线程 ---- Python和Java

    Python: 真正的并行执行多任务只能在    多核CPU    上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统会自动 的把很多任务轮流调度到每个核心上执行. 对于操作系统来说, ...

  7. 利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma

    该案例展示了如何利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma. 在执行本案例前,需要确保正确安装sklearn,以保证SVM部分的代码能够正常执行. 本函数需要用到一个外部数据 ...

  8. 多进程多线程GDB调试 (转)

    多进程多线程GDB调试   一.线程调试指南:   1. gdb attach pid 挂载到调试进程  2. gdb$ set scheduler-locking on 只执行当前选定线程的开关 3 ...

  9. linux c多进程多线程,linux下的C\C++多进程多线程编程实例详解

    linux下的C\C++多进程多线程编程实例详解 1.多进程编程 #include #include #include int main() { pid_t child_pid; /* 创建一个子进程 ...

  10. 进程 线程 多进程 多线程 父进程 子进程

    1. 进程定义: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

最新文章

  1. 分享一个python cookbook的在线教程地址
  2. java 线程池 分组_JAVA面试题解惑系列(十)——话说多线程
  3. html修改headicon,index.html
  4. python元类 orm_python-进阶-元类在ORM上的应用详解
  5. 湖南工业职业技术学院计算机协会,计算机网络协会
  6. python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解
  7. PyTorch框架学习三——张量操作
  8. 睡眠音频分割及识别问题(五)--YAMNet进一步分析
  9. python创建数组的方法_numpy创建array的方法汇总
  10. java使用重复的类库,java list 去除 重复值
  11. Go http访问使用代理
  12. hihocoder第238周:杨氏矩阵的个数
  13. Java基础----泛型
  14. mvn dependency命令
  15. nginx 分别对各个域名跳转
  16. Ajax学习笔记-基础概述-1
  17. oppo手机热点Android,OPPO手机怎么开启热点?OPPO手机共享网络的三种方法
  18. 米老师经典语录————再造生命力
  19. 有哪些大型网站是用 Python 开发的
  20. 2019 Google Developder Days(GDD)

热门文章

  1. java addgap,java GroupLayout格局
  2. 学习git reset 、 git checkout、git revert
  3. 计算机系统基本组成教学设计,《计算机系统的基本组成》教学设计.pdf
  4. 扩展的几个应用 发布网络YUM源 vim编辑技巧 源码编译安装 systemctl控制
  5. 【字符编码系列】字符,字符集,字符编码解惑
  6. JavaWeb开发之网站实现文件上传功能
  7. JavaScript的DOM操作.
  8. property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解...
  9. 一次编译安装SENginx 的小经历.....
  10. 《AIX 5L 系统管理技术》学习笔记之第七章设备管理