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 Requests安装与简单运用
Apr 07 Python
浅谈python数据类型及类型转换
Dec 18 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
深入浅析Python传值与传址
Jul 10 Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
python with语句的原理与用法详解
Mar 30 Python
python随机模块random的22种函数(小结)
May 15 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
python中如何使用虚拟环境
Oct 14 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 addslashes 函数详细分析说明
2009/06/23 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
python简单文本处理的方法
2015/07/10 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
图书馆标语
2014/06/19 职场文书
在职员工证明书
2014/09/19 职场文书
行政司机岗位职责
2015/04/10 职场文书
感恩教育观后感
2015/06/17 职场文书
重阳节主题班会
2015/08/17 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android