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实现给qq邮箱发送邮件的方法
May 28 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python cx_freeze打包工具处理问题思路及解决办法
Feb 13 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
python中私有函数调用方法解密
Apr 29 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Django框架用户注销功能实现方法分析
May 28 Python
python处理“
Jun 10 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python for循环搭配else常见问题解决
Feb 11 Python
用python对oracle进行简单性能测试
Dec 05 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
改变Apache端口等配置修改方法
2008/06/05 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
jquery使用经验小结
2015/05/20 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
vue 优化CDN加速的方法示例
2018/09/19 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
python使用socket进行简单网络连接的方法
2015/04/29 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
自学python用什么系统好
2020/06/23 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
利群广告词
2014/03/20 职场文书
大学活动总结范文
2014/04/29 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
话题作文之自信作文
2019/11/15 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Nginx实现负载均衡的项目实践
2022/03/18 Servers