#master-worker模型:
#coding:utf-8
import os
import sys
import socket
import time
import traceback
import errno
import signal class Worker(object):
def __init__(self, sock):
self.sock = sock def accept(self):
client, addr = self.sock.accept()
client.setblocking(True)
self.handle(client, addr) def init_process(self):
self.sock.setblocking(False)
while True:
try:
time.sleep(1)
self.accept()
continue
except Exception as e:
msg = traceback.format_exc()
with open("sub_"+str(os.getpid())+".txt","a") as f:
f.write(msg+"\n")
if hasattr(e, "errno"):
if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, errno.EWOULDBLOCK):
msg = traceback.format_exc()
else:
raise def handle(self, client, addr):
data = client.recv(1024)
pid = os.getpid()
data += str(pid)
# print("receive:{} pid:{}".format(data, pid))
client.send("back:"+data)
client.close() class Server(object):
def __init__(self):
self.port = ("127.0.0.1", 8004)
self.sock = socket.socket()
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(self.port)
self.sock.setblocking(False)
self.sock.listen(5)
self.WORKERS = {} def run(self):
self.init_signals()
for i in range(2):
self.spawn_worker()
print(i)
# self.spawn_worker()
for k in self.WORKERS:
print(k, self.WORKERS[k])
while True:
import time
time.sleep(3)
try:
pid, status = os.waitpid(-1, os.WNOHANG)
print("kill pid: {}, status: {}".format(pid, status))
except os.error:
print("error") def init_signals(self):
signal.signal(signal.SIGTTIN, self.incr_one)
signal.signal(signal.SIGTTOU, self.decr_one) def incr_one(self, signo, frame):
self.spawn_worker()
for k in self.WORKERS:
print(k, self.WORKERS[k]) def decr_one(self, signo, frame):
for k in self.WORKERS:
os.kill(k, signal.SIGKILL)
break def spawn_worker(self):
worker = Worker(self.sock) pid = os.fork()
if pid != 0:
worker.pid = pid
self.WORKERS[pid] = worker
return pid worker.pid = os.getpid()
worker.init_process()
sys.exit(0) if __name__ == "__main__":
server = Server()
server.run() =======================================================================
epoll模型:
server:
#-*- coding:utf8 -*-
import socket
import select
import os address = "0.0.0.0"
port = 10001
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) def main():
global address,port,sock
epoll = select.epoll()
#获取创建好的sock的文件描述符
fd = sock.fileno()
sock.bind((address,port))
sock_dict = {}
sock_dict[fd] = sock
#对该sock进行注册
epoll.register(fd,select.EPOLLIN)
sock.listen(5)
while True:
events = epoll.poll(1)
for fileno,event in events:
#获取到的文件描述符和sock的相同就说明是一个新的连接
if fileno == fd:
(client,address) = sock.accept()
print address
client.setblocking(0)
#将新的连接进行注册,用来接收消息
epoll.register(client.fileno(),select.EPOLLIN)
sock_dict[client.fileno()] = client
elif event & select.EPOLLIN:
print "fileno:",fileno
data = sock_dict[fileno].recv(128)
if data == '你好':
print "Data:",data.decode('UTF-8')
sock_dict[fileno].send("你好")
elif len(data) == 0:
print "线路%d已下线"%fileno
epoll.unregister(fileno)
else:
print "Data:",data
if __name__ == '__main__':
main() client:
#coding: UTF-8 import socket
import select address = "127.0.0.1"
port = 10001
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) def main():
global address,port,sock
sock.connect((address,port))
epoll = select.epoll()
fd = sock.fileno()
#这里的epoll注册只是用来异步接收服务端发过来的消息
epoll.register(fd,select.EPOLLIN)
while True:
events = epoll.poll(1)
for fileno,event in events:
if fileno == fd:
if event & select.EPOLLIN:
data = sock.recv(128)
print data
data = raw_input(">")
if data == 'q':
break
elif data == '':
print "不能发送空消息"
continue
sock.send(data)
sock.close()
main()

  

[记录]Python的master-worker和epoll模式的更多相关文章

  1. 记录Python学习中的几个小问题

    记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...

  2. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

  3. python celery多worker、多队列、定时任务

    python celery多worker.多队列.定时任务  

  4. python中文件操作的六种模式及对文件某一行进行修改的方法

    一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...

  5. python打开文件可以有多种模式

    一.python打开文件可以有多种模式,读模式.写模式.追加模式,同时读写的模式等等,这里主要介绍同时进行读写的模式r+ python通过open方法打开文件 file_handler = open( ...

  6. 应对百万访问量的epoll模式

    写在前面 select/poll与epoll select/poll模型工作机理 select/poll模型的局限 epoll模型工作机理 epoll的局限 golang中的epoll golang源 ...

  7. python设计模式之模型-视图-控制器模式

    python设计模式之模型-视图-控制器模式 关注点分离( Separation of Concerns, SoC)原则是软件工程相关的设计原则之一. SoC原则背后的思想是将一个应用切分成不同的部分 ...

  8. 使用配置文件方式记录Python程序日志

    开发者可以通过三种方式配置日志记录: 调用配置方法的Python代码显式创建记录器.处理程序和格式化程序. 创建日志配置文件并使用fileConfig() 函数读取. 创建配置信息字典并将其传递给di ...

  9. Beats:使用 Elastic Stack 记录 Python 应用日志

    文章转载自:https://elasticstack.blog.csdn.net/article/details/112259500 日志记录实际上是每个应用程序都必须具备的功能.无论你选择基于哪种技 ...

随机推荐

  1. win10不用密码直接登陆设置

    点击开始菜单里的[运行],然后输入control userpasswords2 或者 netplwiz ,然后点击确定,如下图所示. 点击后,在用户帐户对话框里可以看到“要使用本计算机,用户必须输入用 ...

  2. Delphi 10.2 Linux 程序开发环境部署的基本步骤(网络连接方式要选择桥接或者是Host Only)

    Delphi 10.2 Linux 程序开发环境部署的基本步骤 http://blog.qdac.cc/?p=4477 升級到 Delphi 10.2 Tokyo 笔记http://www.cnblo ...

  3. OpenSSL的命令行用法,以及参数大全

    c:\openssl\bin>opensslOpenSSL> versionOpenSSL 1.0.2j 26 Sep 2016OpenSSL> https://wiki.opens ...

  4. 对Qt for Android的评价(很全面,基本已经没有问题了),可以重用QT积累20年的RTL是好事,QML效率是HTML5的5倍

    现在Qt不要光看跨平台了,Qt也有能力和原生应用进行较量的.可以直接去Qt官网查看他和那些厂商合作.关于和Java的比较,框架和Java进行比较似乎不且实际.如果是C++和Java比较,网上有很多文章 ...

  5. Spring Type Conversion(Spring类型转换)

    Spring Type Conversion(Spring类型转换) 1:概述: Spring3引入了core.convert包,提供了通用类型转换系统,定义了实现类型转换和运行时执行类型的SPI. ...

  6. python trojan development 2nd —— use python to send mail and listen to the key board then combine them

    请勿用于非法用途!!!!!本人概不负责!!!原创作品,转载说明出处!!!!! from pynput.keyboard import Key,Listener import logging impor ...

  7. 简单看看java之枚举

    枚举类这个类用的比较少,对这个不怎么熟悉,最近看源码刚好可以好好了解一下,那么,枚举Enum是什么呢?在jdk中,Enum是一个抽象类下图所示,这就说明这个类是不能进行实例化的,那么我们应该怎么使用呢 ...

  8. CI框架注意

    1.在ci框架中,如果想继承自己写的控制器,从而不继承CI_Controller,可以在application/core中定义控制器,从而就可以在controllers中的控制器继承. 2.在ci框架 ...

  9. 《深入浅出RxJS》读书笔记

    rxjs的引入 // 如果以这种方式导入rxjs,那么整个库都会导入,我们一般不可能在项目中运用到rxjs的所有功能 const Rx = require('rxjs'); 解决这个问题,可以使用深链 ...

  10. oraclesql遇见的问题(一)

    在oracle的数据库,对于字段为null的字段过滤条件只能用is null 或者 is not null,不能使用 != , <> , = 判断, 今天进行接口测试时,发现获取到的数据缺 ...