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入门篇之面向对象
Oct 20 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
Python使用getpass库读取密码的示例
Oct 10 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
Python实现句子翻译功能
Nov 14 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
django将图片上传数据库后在前端显式的方法
May 25 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
python 中的@运算符使用
May 26 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
python实现ID3决策树算法
2018/08/29 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
selenium自动化测试入门实战
2020/12/21 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
C++是不是类型安全的
2014/02/18 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
财务管理个人自荐书范文
2013/11/24 职场文书
学习党课思想汇报
2013/12/29 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
婚礼答谢词范文
2015/09/29 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL