18 11 26 用多进程 多线程 携程 实现 http 服务器的创建
下面是一个 多进程 服务器的创建
- import socket
- import re
- import multiprocessing
- 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() # Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
- print("")
- print(">" * 20)
- print(request_lines)
- # GET /index.html HTTP/1.1
- # get post put del
- file_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 准备发送给浏览器的数据---header
- response = "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. 为这个客户端服务
- # service_client(new_socket) # 下面用了多进程的方法代替了这句话
- p = multiprocessing.Process(target = service_client, args = (new_socket,))
- p.start()
- new_socket.close()
- # 关闭监听套接字
- tcp_server_socket.close()
- if __name__ == "__main__":
- main()
下面是一个多进程的 http 服务器
- import socket
- import re
- import threading
- 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() # Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
- print("")
- print(">" * 20)
- print(request_lines)
- # GET /index.html HTTP/1.1
- # get post put del
- file_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 准备发送给浏览器的数据---header
- response = "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. 为这个客户端服务
- # service_client(new_socket) # 下面用了多进程的方法代替了这句话
- p = threading.Thread(target = service_client, args = (new_socket,))
- p.start()
- # 关闭监听套接字
- tcp_server_socket.close()
- if __name__ == "__main__":
- main()
- import socket
- import re
- import gevent
- from gevent import monkey
- monkey.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() # Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
- print("")
- print(">" * 20)
- print(request_lines)
- # GET /index.html HTTP/1.1
- # get post put del
- file_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 准备发送给浏览器的数据---header
- response = "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. 为这个客户端服务
- # service_client(new_socket) # 下面用了携程的方法代替了这句话
- gevent.spawn(service_client,new_socket)
- # 关闭监听套接字
- tcp_server_socket.close()
- if __name__ == "__main__":
- main()
18 11 26 用多进程 多线程 携程 实现 http 服务器的创建的更多相关文章
- python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都 ...
- python 多进程/多线程/协程 同步异步
这篇主要是对概念的理解: 1.异步和多线程区别:二者不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段.异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事 ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- [18/11/26] this关键字、static关键字和静态块(及语句块)
1.this关键字 this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建.因此,在构造方法中也可以使用this代表“当前对象” [用法] 1. 在程序中产生二义性之处 ...
- 多线程、多进程、协程、缓存(memcache、redis)
本节内容: 线程: a:基本的使用: 创建线程: 1:方法 import threading def f1(x): print(x) if __name__=='__main__': t=thread ...
- Python爬虫 | 多线程、多进程、协程
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...
- web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)
知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...
- 也说性能测试,顺便说python的多进程+多线程、协程
最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下 一.分析接口频率 根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以 ...
- Python多线程、多进程和协程的实例讲解
线程.进程和协程是什么 线程.进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程.线程.协程之概念理解 进程(Process)是计算机中 ...
随机推荐
- imple-unpack---攻防世界
拿到题目查壳没有发现.题目已经明确说了,基本上是有壳的,Linux下面看看 应该就是upx的壳了,下载upx进行脱壳,https://sourceforge.net/projects/upx/file ...
- stm32CubeMx CAN 发送数据
平台 STM32F429 软件 STM32CubeMx 5.0.0 固件库 STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一 简介 CAN是控制器局域网络(Co ...
- tools.quartz.about
官方网站,中文文档,demo, 参考零, 参考一, 参考二, 参考三, 参考四 , 参考五 ,文档下载 .
- [Codeforces] #603 (Div. 2) A-E题解
[Codeforces]1263A Sweet Problem [Codeforces]1263B PIN Code [Codeforces]1263C Everyone is a Winner! [ ...
- UVA 12510/CSU 1119 Collecting Coins DFS
前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...
- jmeter性能测试--浪涌测试
1. Ultimate Thread Group 右键测试计划-添加-Theads(Users)-Ultimate Thread Group,如下图1所示 图1 图2 参数说明,如下图 ...
- springboot创建bean
springboot创建bean的方式有两种: 1.直接类上加注解@Component@Controller@Service ... 2.使用@Bean注解配合@Configuration注解 区别是 ...
- Sublime和Python中文编码的一些问题
Windows下的控制台中,应该是这样的逻辑: 1.如果是Unicode字符串的话,首先根据控制台编码进行转换 2.之后进行输出 所以在Windows控制台下,假设str = u'中文', 1.直接p ...
- .net Form 的Autoscalemode属性
.net Form 的Autoscalemode属性如果设置成Font 将会随着系统字体的大小来改变form大小 有时候会造成布局混乱,小心使用
- 吴裕雄--天生自然C++语言学习笔记:C++ 动态内存
栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运 ...