面向对象epoll并发
面向对象epoll
# -*- coding: utf-8 -*-
import socket
import selectors
import re
import sys HTML_ROOT = "./static"
WSGI_ROOT = "./wsgipy" class Httpserver:
def __init__(self):
self.server = socket.socket()
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 释放端口
self.epoll_selector = selectors.EpollSelector() def bind(self, port):
self.server.bind(('', port)) def start(self):
self.server.listen(1000)
# self.server为套接字对象(也是server_conn的参数), self.server_conn为方法(必须由一个参数接收该对象)
self.epoll_selector.register(self.server, selectors.EVENT_READ, self.server_conn)
while True:
events = self.epoll_selector.select()
for event, n in events:
file_obj = event.fileobj
callback = event.data
callback(file_obj) def server_conn(self, server):
conn, addr = server.accept()
self.epoll_selector.register(conn, selectors.EVENT_READ, self.server_recv) def server_recv(self, conn):
recv_data = conn.recv(1024)
if recv_data:
response_data_line = recv_data.splitlines()[0]
file_path = re.match(r'\w+ +(/[^ ]*) ', response_data_line.decode()).groups()[0]
# if file_path == '/favicon.ico':
# response_header = 'HTTP/1.1 200 OK\r\n'
# response_header += "Content-Type: text/image\r\n"
print(file_path)
# 动态执行py文件
if file_path.endswith('.py'):
try:
module = __import__(file_path[1:-3])
except Exception:
response_header = 'HTTP/1.1 404 NotFound\r\n'
send_html_content = 'no cun zai'
else:
send_html_content = module.application({}, self.start_response)
response_header = self.response_header
else:
if file_path == '/':
file_path = '/index.html'
file_path = HTML_ROOT + file_path
send_html_content = self.read_file(file_path)
if not send_html_content:
response_header = 'HTTP/1.1 404 NotFound\r\n'
send_html_content = 'This page is not found.'
else:
response_header = 'HTTP/1.1 200 OK\r\n'
response_server_version = 'super: 1.1\r\n'
send_data = response_header + response_server_version + '\r\n' + send_html_content
conn.send(send_data.encode())
self.epoll_selector.unregister(conn)
conn.close() def start_response(self, status, headers):
response_header = "HTTP/1.1" + status + "\r\n" + "super: 1.1\r\n"
for i in headers:
response_header += "%s: %s\r\n" % i
self.response_header = response_header def read_file(self, file_path):
try:
with open(file_path, 'rb') as f:
content = f.read()
except Exception:
return False
print(file_path)
return content.decode() if __name__ == '__main__':
# sys.path.insert(1, HTML_ROOT)
# sys.path.insert(1, WSGI_ROOT)
server = Httpserver()
server.bind(8000)
server.start()
面向对象epoll并发的更多相关文章
- python实现并发服务器实现方式(多线程/多进程/select/epoll)
python实现并发服务器实现方式(多线程/多进程/select/epoll) 并发服务器开发 并发服务器开发,使得一个服务器可以近乎同一时刻为多个客户端提供服务.实现并发的方式有多种,下面以多进 ...
- [转载]并发编程之Operation Queue和GCD
并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...
- 【转】并发编程之Operation Queue
http://blog.xcodev.com/blog/2013/10/28/operation-queue-intro/ 随着移动设备的更新换代,移动设备的性能也不断提高,现在流行的CPU已经进入双 ...
- JDFS:一款分布式文件管理实用程序第一篇(线程池、epoll、上传、下载)
一 前言 截止目前,笔者在博客园上面已经发表了3篇关于网络下载的文章,这三篇博客实现了基于socket的http多线程远程断点下载实用程序.笔者打算在此基础上开发出一款分布式文件管理实用程序,截止目前 ...
- Socket编程实践(11) --epoll原理与封装
常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 se ...
- 基于EPOLL模型的局域网聊天室和Echo服务器
一.EPOLL的优点 在Linux中,select/poll/epoll是I/O多路复用的三种方式,epoll是Linux系统上独有的高效率I/O多路复用方式,区别于select/poll.先说sel ...
- 【Network】高性能 UDP 应该怎么做?
参考资料: EPOLL-UDP-GOLANG golang udp epoll - Google 搜索 go - golang: working with multiple client/server ...
- 采访:Go语言编程
Go语言是由Google在2009年11月份公布的,它的目标是要应对软件开发所面临的最新挑战.Go语言特别被设计为快速(包括在编译时).支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性 ...
- 使用multiprocessing模块操作进程
1.Process模块介绍 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. Process([group [, target [, name [, args [, kwa ...
随机推荐
- java集合与包装类
一.集合概述 1 为什么需要使用集合? 引入案例:存储每天产生的新闻. 是要解决数组的局限性(定长),由于数组定长,可能会导致内存浪费或者内存不够. 需要一种技术:能够根据数据量而动态伸缩内存空间一种 ...
- WPF动态时间(电子表)
private DispatcherTimer dispatcherTimer; public MainWindow() { InitializeComponent(); dispatcherTime ...
- SpringBoot工程+热部署进行远程调试
本文转载自:https://blog.csdn.net/qq_31868349/article/details/78553901 SpringBoot工程+热部署进行远程调试 本地端添加配置 在pom ...
- 【IIS错误 - HTTP 错误 500.19】HTTP 错误 500.19- Internal Server Error 错误解决方法(二)
昨天在 windows 7 下用 IIS 7.5 运行一个以前用 .NET Framework 3.5 写的项目,发现总是出现 500.19 错误,如下: 百度了好久,没找到解决问题确切的答案,我也知 ...
- Sequentially-consistent ordering
先引入cppreference中的描述: Atomic operations tagged memory_order_seq_cst not only order memory the same wa ...
- Zabbix 告警内容配置
#配置媒介告警类型 #----------------------------------------------------------------------------------------- ...
- maven之BOM及BOM和provided的一个小坑
BOM(Bill of Materials)定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号.BOM的维护方负责版本升级,并保证 ...
- python:数据类型
一.数据类型 1.数字int型 主要进行计算 bit_length() 当十进制用二进制表示时,最少使用的位数 a = 13 b = a.bit_length() print (b) 2.布尔值boo ...
- [UE4]GameMode、GameInstance、GameState、PlayerState、PlayerController
一.只有PlayerController和Pawn/Character才有输入事件(键盘.鼠标等等),PlayerState没有输入事件. 二.对于需要跨域关卡的数据信息,根据上图所知需要放到Game ...
- CAS锁相关讲解
感谢GOOGLE强大的搜索,借此挖苦下百度,依靠百度什么都学习不到! 参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html ...