[记录]Python的master-worker和epoll模式
#master-worker模型:
#coding:utf-8
import os
import sys
import socket
import time
import traceback
import errno
import signalclass Worker(object):def __init__(self, sock):self.sock = sockdef 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()continueexcept 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:raisedef 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 timetime.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)breakdef spawn_worker(self):worker = Worker(self.sock)pid = os.fork()if pid != 0:worker.pid = pidself.WORKERS[pid] = workerreturn pidworker.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()
转载于:https://www.cnblogs.com/wsjhk/p/8502915.html
[记录]Python的master-worker和epoll模式相关推荐
- linux 并行 模式,并行设计模式-Master/Worker
Master-Worker设计模式核心思想是将原来串行的逻辑并行化,并将逻辑拆分成很多独立模块并行执行,其中主要包含两个主要组件Master和Worker,Master主要讲逻辑进行查分,拆分为互相独 ...
- Python中的select、epoll详解
Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...
- 使用Python,OpenCV,本地二进制模式(LBP)进行人脸识别
使用Python,OpenCV与本地二进制模式(LBP)进行人脸识别 1. 效果图 2. 原理及步骤 2.1 原理 2.2 步骤 3. 源码 参考 在深度学习和暹罗网络之前,面部识别算法依赖于特征提取 ...
- Nginx源码分析:master/worker工作流程概述
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...
- centos7.6使用kubeadm安装kubernetes的master worker节点笔记及遇到的坑
个人博客原文地址:http://www.lampnick.com/php/760 本文目标 安装docker及设置docker代理 安装kubeadm 使用kubeadm初始化k8s Master节点 ...
- Python读写文件的七种模式(r,w,x,a,b,t,+)
文章目录 前言 正文 小结 前言 如题.一直对此不求甚解,这里记录之. 正文 主要参考: https://docs.python.org/3/library/functions.html#filemo ...
- 具有Python&OpenCV的本地二进制模式
具有Python&OpenCV的本地二进制模式 1. 效果图 2. 原理 2.1 项目结构 2.2 数据集构建 2.3 什么是本地二进制模式? 3. 源码 参考 这篇博客将介绍如何使用本地二进 ...
- 详细记录python的range()函数用法
详细记录python的range()函数用法 使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的sl ...
- python的out模式_如何用python中的DataFrame列的模式替换NA值?
我对Python(和本网站)完全陌生,目前正试图用它们的模式替换特定数据帧列中的NA值.我试过了各种不起作用的方法.请帮我看看我做错了什么:如何用python中的DataFrame列的模式替换NA值? ...
- [转载] Python进阶:设计模式之迭代器模式
参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...
最新文章
- 备份与恢复oracle,oracle 备份与恢复
- Linux下安装PCRE
- vscode使用教程python-使用VS Code进行Python编程
- OC之NSArray/NSMutableArrray
- LDR指令和LDR伪指令区别
- WebStorm 预览时把浏览器地址localhost 改成IP
- java古剑奇谭_古剑奇谭页游源码web可编译的源代码分享价值百万的100%完整源代码...
- Android 快捷键
- android 5.0 字体,QC8916 修改系统默认字体(Android 5.0)
- Rust : actor模式 与 Actix库
- 数据挖掘:关联分析—Apriori算法
- 国家统计局统计用区划代码和城乡划分代码---爬虫、详细分析
- PHP教程一环境搭建 Wampserve 下载和安装
- GPU架构和Compute Shader线程规划
- c语言msgbox函数,msgbox函数的返回值类型为什么
- 1124 Raffle for Weibo Followers
- ionicapp开场动画_动画开场类型
- EditText相关设置
- 提前揭秘CJ八大看点
- 低密度奇偶校验码(LDPC)