#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模式相关推荐

  1. linux 并行 模式,并行设计模式-Master/Worker

    Master-Worker设计模式核心思想是将原来串行的逻辑并行化,并将逻辑拆分成很多独立模块并行执行,其中主要包含两个主要组件Master和Worker,Master主要讲逻辑进行查分,拆分为互相独 ...

  2. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

  3. 使用Python,OpenCV,本地二进制模式(LBP)进行人脸识别

    使用Python,OpenCV与本地二进制模式(LBP)进行人脸识别 1. 效果图 2. 原理及步骤 2.1 原理 2.2 步骤 3. 源码 参考 在深度学习和暹罗网络之前,面部识别算法依赖于特征提取 ...

  4. Nginx源码分析:master/worker工作流程概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...

  5. centos7.6使用kubeadm安装kubernetes的master worker节点笔记及遇到的坑

    个人博客原文地址:http://www.lampnick.com/php/760 本文目标 安装docker及设置docker代理 安装kubeadm 使用kubeadm初始化k8s Master节点 ...

  6. Python读写文件的七种模式(r,w,x,a,b,t,+)

    文章目录 前言 正文 小结 前言 如题.一直对此不求甚解,这里记录之. 正文 主要参考: https://docs.python.org/3/library/functions.html#filemo ...

  7. 具有Python&OpenCV的本地二进制模式

    具有Python&OpenCV的本地二进制模式 1. 效果图 2. 原理 2.1 项目结构 2.2 数据集构建 2.3 什么是本地二进制模式? 3. 源码 参考 这篇博客将介绍如何使用本地二进 ...

  8. 详细记录python的range()函数用法

    详细记录python的range()函数用法 使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的sl ...

  9. python的out模式_如何用python中的DataFrame列的模式替换NA值?

    我对Python(和本网站)完全陌生,目前正试图用它们的模式替换特定数据帧列中的NA值.我试过了各种不起作用的方法.请帮我看看我做错了什么:如何用python中的DataFrame列的模式替换NA值? ...

  10. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

最新文章

  1. 备份与恢复oracle,oracle 备份与恢复
  2. Linux下安装PCRE
  3. vscode使用教程python-使用VS Code进行Python编程
  4. OC之NSArray/NSMutableArrray
  5. LDR指令和LDR伪指令区别
  6. WebStorm 预览时把浏览器地址localhost 改成IP
  7. java古剑奇谭_古剑奇谭页游源码web可编译的源代码分享价值百万的100%完整源代码...
  8. Android 快捷键
  9. android 5.0 字体,QC8916 修改系统默认字体(Android 5.0)
  10. Rust : actor模式 与 Actix库
  11. 数据挖掘:关联分析—Apriori算法
  12. 国家统计局统计用区划代码和城乡划分代码---爬虫、详细分析
  13. PHP教程一环境搭建 Wampserve 下载和安装
  14. GPU架构和Compute Shader线程规划
  15. c语言msgbox函数,msgbox函数的返回值类型为什么
  16. 1124 Raffle for Weibo Followers
  17. ionicapp开场动画_动画开场类型
  18. EditText相关设置
  19. 提前揭秘CJ八大看点
  20. 低密度奇偶校验码(LDPC)

热门文章

  1. 端午节,我们好好聊聊程序员这个群体
  2. 我心目中的支付宝架构
  3. AndroidDeveloper Weekly No.5
  4. 1. java程序的编译命令_Java中javac、java、javap使用详解(java编译命令)
  5. Luogu P2048 [NOI2010]超级钢琴
  6. Django下的templates 和 static静态文件
  7. 17995 Stupid thief 组合数学
  8. 用户体验的13条金科玉律
  9. java常用类、最常用的包
  10. Jquery 1.4.2 animate的BUG