1.线程、进程实现多任务HTTP服务器

import re
import socket
import multiprocessing
import threadingdef service_client(new_socket):"""为这个客户端返回数据"""#  接收浏览器发送过来的请求,即HTTP请求request=new_socket.recv(1024)request=request.decode("utf-8")  #  解码request_lines=request.splitlines()  #  按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表print(request_lines)#  GET /index.html HTTP/1.1#  [^/]表示除了/都可以file_name=""ret=re.match(r"[^/]+(/[^ ]*)",request_lines[0])if ret:file_name=ret.group(1)if file_name=="/":file_name="/index.html"#  2.返回HTTP格式的数据,给浏览器try:#  准备发送的body,打开HTML文件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()#  准备发送的headerresponse="HTTP/1.1 200 OK\r\n"response+="\r\n"  #  header与body之间必须隔一行#  发送headernew_socket.send(response.encode("utf-8"))#  发送HTMLnew_socket.send(html_content)new_socket.close()def main():tcp_sever_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#  服务器先关闭,保证重新开启不占用端口tcp_sever_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)tcp_sever_socket.bind(("",7890))tcp_sever_socket.listen(128)while True:#  等待新客户端的链接new_socket,client_addr=tcp_sever_socket.accept()#p=multiprocessing.Process(target=service_client,args=(new_socket,))p=threading.Thread(target=service_client,args=(new_socket,))p.start()#  子进程关闭一次主进程还需关闭一次,Linux下文件硬链接的原因,两个名字指向同一个文件,因此要关闭两次#new_socket.close()#  关闭监听套接字tcp_sever_socket.close()
if __name__ == '__main__':main()

2.gevent协程实现多任务HTTP服务器

import re
import socket
import gevent
from gevent import monkeymonkey.patch_all()
def service_client(new_socket):"""为这个客户端返回数据"""#  接收浏览器发送过来的请求,即HTTP请求request=new_socket.recv(1024)request=request.decode("utf-8")  #  解码request_lines=request.splitlines()  #  按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表print(request_lines)#  GET /index.html HTTP/1.1#  [^/]表示除了/都可以file_name=""ret=re.match(r"[^/]+(/[^ ]*)",request_lines[0])if ret:file_name=ret.group(1)if file_name=="/":file_name="/index.html"#  2.返回HTTP格式的数据,给浏览器try:#  准备发送的body,打开HTML文件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()#  准备发送的headerresponse="HTTP/1.1 200 OK\r\n"response+="\r\n"  #  header与body之间必须隔一行#  发送headernew_socket.send(response.encode("utf-8"))#  发送HTMLnew_socket.send(html_content)new_socket.close()def main():tcp_sever_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#  服务器先关闭,保证重新开启不占用端口tcp_sever_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)tcp_sever_socket.bind(("",7890))tcp_sever_socket.listen(128)while True:#  等待新客户端的链接new_socket,client_addr=tcp_sever_socket.accept()gevent.spawn(service_client,new_socket)#  关闭监听套接字tcp_sever_socket.close()
if __name__ == '__main__':main()

Python实现HTTP服务器(三)线程、进程、协程实现多任务相关推荐

  1. python线程进程协程面试_Python学习经验之谈:关于协程的理解和其相关面试问题...

    都知道Python非常适合初学者学习来入门编程,昨天有伙伴留言说面试了Python岗位,问及了一个关于协程的问题,想了想还是跟大家出一篇协程相关的文章和在Python面试中可能会问及的相关面试问题.都 ...

  2. 打开线程 | 进程 | 协程的大门

    不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的. ...

  3. python协程和线程_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...

  4. python apply_async死锁_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...

  5. python_21_线程+进程+协程

    python_线程_进程_协程 什么是线程? -- os能够进行运算调度的最小单位,被包含在进程之中,是一串指令的集合 -- 每个线程都是独立的,可以访问同一进程下所有的资源 什么是进程? -- 每个 ...

  6. 十四丶并发编程(线程 进程 协程)

    Yuan先生 知识预览 操作系统 回到顶部 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系 ...

  7. 11.python之线程,协程,进程,

    一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

  8. Python 进程、线程、协程傻傻分不清楚?详细总结(附代码)

    目录 1 什么是并发编程? 2 进程与多进程 3 线程与多线程 4 协程与多协程 5 总结 1 什么是并发编程? 并发编程是实现多任务协同处理,改善系统性能的方式.Python中实现并发编程主要依靠 ...

  9. python 进程,线程,协程篇

    python 进程,线程,协程篇 ssh 线程 进程 线程,进程区别 threading 模块,两种调用方式 python GIL全局解释器锁(Global Interpreter Lock) Joi ...

最新文章

  1. Scrapy 学习笔记(-)
  2. 【青少年编程】【三级】打气球游戏
  3. 遗传算法解决TSP问题 Python实现【160行以内代码】
  4. 关于养花---感叹一把
  5. 采用8种相位,每种相位各有两种幅度的QAM调制方法,在1200Baud的信号传输速率下能达到的网数据传输速率为( )
  6. SAP ABAP Netweaver里进程能够申请的最大内存
  7. tomcat无法访问MySQL_JSP在tomcat服务器下无法连接MySql问题解决方法
  8. WebServices 基础知识
  9. 八类网线和七类网线的区别_什么是七类网线?七类网线水晶头如何制作?
  10. linux离线安装redmine_Feem:免流量跨平台文件传输工具,支持离线分享
  11. sql语句执行步骤详解
  12. 轻松搞定JSONP跨域请求
  13. mysql set语句_从强网杯随便注浅析mysql存储过程
  14. 【开源】多多客发布 3.0.0-alpha.6,Koa+Vue+Taro最佳实践
  15. android json字符串转成json对象_【hive】解析JSON格式字符串
  16. Performance Engineering of Software Systems (四) ——工具使用
  17. 使用EasyCHM破解版制作CHM帮助文档
  18. 陆维家具设计拆单软件
  19. 永磁同步电机SVPWM过调制电压重构MTPA弱磁矢量控制仿真 模型
  20. c语言迭代埃特金加速算法,5-埃特金加速迭代算法

热门文章

  1. 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
  2. 软件开发中的资源控制问题学习
  3. 网络飞鸽传书容易犯的错
  4. Visual Studio 调试器---Visual Studio 调试器
  5. VC实现对话框上信息的显示
  6. 新手程序员不知道的小技巧!
  7. HTML5 API详解(6):getUserMedia实现拍照功能
  8. 外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!
  9. 抹掉所有内容和设置 macOS Monterey这个新功能太好用
  10. 6款英雄主题fcpx标题字幕插件:Hero Shot Titles for Mac