python单线程下实现多个socket并发过程详解


Posted in Python onJuly 27, 2019

先看服务端的代码

import sys
# import socket
import time
import gevent
from gevent import socket
from gevent import monkey
monkey.patch_all()
#类似于python中的黑魔法,把很多模块的阻塞的变成非阻塞的,比如socket中的rece和send都变
# 为不阻塞了
 
 
def server(port):
  s = socket.socket()
  s.bind(("127.0.0.1",port))
  s.listen(2000)
  while True:
    cli,add = s.accept()
    gevent.spawn(handle_request,cli)
    #通过gevent的启动一个协程,把客户端的socket对象传进去
def handle_request(s):
  try:
    while True:
      data = s.recv(1024)
      print("收到的信息:",str(data,encoding="utf-8"))
      s.send(data)
      if not data:
        s.shutdown(socket.SHUT_WR)
        #把和客户端这个链接销毁
  except Exception as ex:
    print(ex)
  finally:
    s.close()
 
if __name__ == '__main__':
  server(8000)

在看客户端的代码,分别使用多线程和多进程实现

import socket
import gevent
import threading
import multiprocessing
'''
ip_bind = ("127.0.0.1",8000)
c = socket.socket()
c.connect(ip_bind)
while True:
  data = input("客户端:")
  c.send(bytes(data,encoding="utf-8"))
  data = c.recv(1024)
  print("服务端:",str(data,encoding="utf-8"))
 
c.close()
'''
import socket
import gevent
ip_bind = ("127.0.0.1",8000)
c = socket.socket()
c.connect(ip_bind)
def f(n):
  while True:
    # c.send(bytes(n,encoding="utf-8"))
    data = str(n)
    c.send(bytes(data,encoding="utf-8"))
    data = c.recv(1024)
    print("server:",str(data,encoding="utf-8"))
  c.close()
x = []
if __name__ == '__main__':
  l = []
  """
  多线程实现并发客户端
    for i in range(500):
     t = threading.Thread(target=f,args=[str(i),])
     t.start()
     l.append(t)
  for t in l:
     t.join()
 
  """
  # 多进程实现并发客户端
  for i in range(100):
    p = multiprocessing.Process(target=f,args=[i,])
    p.start()
    l.append(p)
  for p in l:
    p.join()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python判断字符串与大小写转换
Jun 08 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
python脚本内运行linux命令的方法
Jul 02 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
python文件处理fileinput使用方法详解
Jan 02 Python
Python descriptor(描述符)的实现
Nov 15 Python
Python可以用来做什么
Nov 23 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
如何用Django处理gzip数据流
Jan 29 Python
教你使用pyinstaller打包Python教程
May 27 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 Python
如何使用python操作vmware
Jul 27 #Python
利用python计算windows全盘文件md5值的脚本
Jul 27 #Python
Djang的model创建的字段和参数详解
Jul 27 #Python
python中bs4.BeautifulSoup的基本用法
Jul 27 #Python
Django的Modelforms用法简介
Jul 27 #Python
在django admin中添加自定义视图的例子
Jul 26 #Python
深入了解Django中间件及其方法
Jul 26 #Python
You might like
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php操作xml入门之cdata区段
2015/01/23 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
用python写asp详细讲解
2013/12/16 Python
跟老齐学Python之开始真正编程
2014/09/12 Python
Python用GET方法上传文件
2015/03/10 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
python实现音乐下载器
2018/04/15 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
2020/05/11 Python
django rest framework 过滤时间操作
2020/07/12 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
python pip如何手动安装二进制包
2020/09/30 Python
优秀班干部事迹材料
2014/01/26 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
作风建设演讲稿
2014/05/23 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技