python 实现socket服务端并发的四种方式


Posted in Python onDecember 14, 2020

多进程&多线程

服务端:多进程和多线程的开启方式相同。

缺点:<1> 由于Cpython的GIL,导致同一时间无法运行多个线程;<2> 不可能无限开进进程或线程

解决办法:多进程、concurrent.futures.ProcessPoolExecutor、线程池

import socket
from multiprocessing import Process
from threading import Thread


class MyTcpServer:
  def __init__(self, ip, port):
    self.ip = ip
    self.port = port
    self.server = socket.socket()
    self.server.bind((self.ip, self.port))
    self.server.listen(5)

  def wait_accept(self):
    conn, addr = self.server.accept()
    return conn, addr

  def handle_request(self, conn):
    while 1:
      try:
        data = conn.recv(1024)
        if not data: break
        conn.send(data.upper())
      except Exception as e:
        print(e)
        break
    conn.close()


if __name__ == '__main__':
  server = MyTcpServer('127.0.0.1', 8888)
  while 1:
    conn, addr = server.wait_accept()
    p = Process(target=server.handle_request, args=(conn, ))	# 创建一个进程
    p.start()	# 告诉操作提供,开启这个进程

进程池&线程池

异步提交任务,支持异步接收返回结果(submit返回一个futures对象,调用add_done_callback方法)

import socket
from concurrent.futures import ProcessPoolExecutor
# from concurrent.futures import ThreadPoolExecutor


class MyTcpServer:
  def __init__(self, ip, port):
    self.ip = ip
    self.port = port
    self.server = socket.socket()
    self.server.bind((self.ip, self.port))
    self.server.listen(5)

  def wait_accept(self):
    conn, addr = self.server.accept()
    return conn, addr

  def handle_request(self, conn):
    while 1:
      try:
        data = conn.recv(1024)
        if not data: break
        conn.send(data.upper())
      except Exception as e:
        print(e)
        break
    conn.close()


if __name__ == '__main__':
  server = MyTcpServer('127.0.0.1', 8888)
  pool = ProcessPoolExecutor(5)    # 5个进程一直服务

  while 1:
    conn, addr = server.wait_accept()
    pool.submit(server.handle_request, conn)	# 异步提交任务

socketserver

优点:简化socket服务端创建流程。
提供服务端串行和并发两种服务模式(TCPServer,ThreadingTCPServer)
缺点:windows上无法使用多进程实现并发

import socketserver


class MyTcpHandler(socketserver.BaseRequestHandler):
  def handle(self):		# 通信循环
    while 1:
      try:
        data = self.request.recv(1024)
        if not data: break
        self.request.send(data.upper())
      except Exception as e:
        print(e)
        break
    self.request.close()


if __name__ == '__main__':
  ip_port = '127.0.0.1', 8888
  server = socketserver.ThreadingTCPServer(ip_port, MyTcpHandler) # 异步处理 
  server.serve_forever()		# 连接循环

协程

优点:单线程内实现并发,代码级别模拟IO切换,提高程序运行效率

from gevent import spawn, monkey;monkey.patch_all()		# 猴子补丁,补丁:常规IO
import socket


class MyTcpServer:
  def __init__(self, ip, port, my_spawn):
    self.ip = ip
    self.port = port
    self.server = socket.socket()
    self.server.bind((self.ip, self.port))
    self.server.listen(5)
    self.spawn = my_spawn		# 保存spawn本地

  def wait_accept(self):
    while 1:
      conn, addr = self.server.accept()
      self.spawn(self.handle_request, conn)	# 检测 handle_request的io

  def handle_request(self, conn):
    while 1:
      try:
        data = conn.recv(1024)
        if not data: break
        conn.send(data.upper())
      except Exception as e:
        print(e)
        break
    conn.close()


if __name__ == '__main__':
  server = MyTcpServer('127.0.0.1', 8888, spawn)
  g1 = server.spawn(server.wait_accept)	# 检测wait_accept的io
  g1.join()	# 等待g1运行结束,即一直在循环检测io

以上就是python 实现socket服务端并发的四种方式的详细内容,更多关于python socket服务端并发的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
python cs架构实现简单文件传输
Mar 20 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
dpn网络的pytorch实现方式
Jan 14 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 Python
Python 实现一个计时器
Jul 28 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
python unittest单元测试的步骤分析
Aug 02 Python
python双向链表实例详解
May 25 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 #Python
Python获取指定网段正在使用的IP
Dec 14 #Python
python利用pytesseract 实现本地识别图片文字
Dec 14 #Python
python 利用百度API识别图片文字(多线程版)
Dec 14 #Python
python3中for循环踩过的坑记录
Dec 14 #Python
Python 数据分析之逐块读取文本的实现
Dec 14 #Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 #Python
You might like
php中url函数介绍及使用示例
2014/02/13 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
three.js 如何制作魔方
2020/07/31 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
python类中super()和__init__()的区别
2016/10/18 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
python查询mysql,返回json的实例
2018/03/26 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
微信公众号token验证失败解决方案
2019/07/22 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
团结演讲稿范文
2014/05/23 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
2015入党自传格式范文
2015/06/26 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
500字作文之难忘的同学
2019/12/20 职场文书