ok,首先写一个python socket的server段,对开放三个端口:10000,10001,10002.krondo的例子中是每个server绑定一个端口,测试的时候需要分别开3个shell,分别运行.这太麻烦了,就分别用三个thread来运行这些services.

import optparse

import os

import socket

import time

from threading import thread

import stringio

txt = '''1111

2222

3333

4444

'''

def server(listen_socket):

while true:

buf = stringio.stringio(txt)

sock, addr = listen_socket.accept()

print 'somebody at %s wants poetry!' % (addr,)

while true:

try:

line = buf.readline().strip()

if not line:

sock.close()

break

sock.sendall(line) # this is a blocking call

print 'send bytes to client:%s' % line

#sock.close()

except socket.error:

sock.close()

break

time.sleep(1) #server和client连接后,server会故意每发送一个单词后等待一秒钟后再发送另一个单词

def main():

ports = [10000, 10001, 10002]

for port in ports:

listen_socket = socket.socket(socket.af_inet, socket.sock_stream)

listen_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

addres = (str('127.0.0.1'), port)

listen_socket.bind(addres)

listen_socket.listen(5)

print "start listen at:%s" % (port,)

worker = thread(target = server, args = [listen_socket])

worker.setdaemon(true)

worker.start()

if __name__ == '__main__':

main()

while true:

time.sleep(0.1) #如果不sleep的话,cpu会被python完全占用了

pass

下面是一个client,没有才用异步网络,连接这个三个端口的server:

import socket

if __name__ == '__main__':

ports = [10000, 10001, 10002]

for port in ports:

address = (str('127.0.0.1'), port)

sock = socket.socket(socket.af_inet, socket.sock_stream)

sock.connect(address)

poem = ''

while true:

data = sock.recv(4)

if not data:

sock.close()

break

poem += data

print poem

下面用异步的client来读取,代码如下:

import datetime, errno, optparse, select, socket

def connect(port):

"""connect to the given server and return a non-blocking socket."""

address = (str('127.0.0.1'), port)

sock = socket.socket(socket.af_inet, socket.sock_stream)

sock.connect(address)

sock.setblocking(0)

return sock

def format_address(address):

host, port = address

return '%s:%s' % (host or '127.0.0.1', port)

if __name__ == '__main__':

ports = [10000, 10001, 10002]

start = datetime.datetime.now()

sockets = map(connect, ports)

poems = dict.fromkeys(sockets, '') # socket -> accumulated poem

# socket -> task numbers

sock2task = dict([(s, i + 1) for i, s in enumerate(sockets)])

sockets = list(sockets) # make a copy

while sockets:

#运用select来确保那些可读取的异步socket可以立即开始读取io

#os不停的搜索目前可以read的socket,有的话就返回rlist

rlist, _, _ = select.select(sockets, [], [])

for sock in rlist:

data = ''

while true:

try:

new_data = sock.recv(1024)

except socket.error, e:

if e.args[0] == errno.ewouldblock:

break

raise

else:

if not new_data:

break

else:

print new_data

data += new_data

task_num = sock2task[sock]

if not data:

sockets.remove(sock)

sock.close()

print 'task %d finished' % task_num

else:

addr_fmt = format_address(sock.getpeername())

msg = 'task %d: got %d bytes of poetry from %s'

print msg % (task_num, len(data), addr_fmt)

poems[sock] += data

elapsed = datetime.datetime.now() - start

print 'got poems in %s' % elapsed

结果只需要4秒就完成了读取任务。效率是刚才同步socket的三倍。对客户端的异步改造主要有两点:

同步模式下,客户端分别创建socket;而在异步模式下,client开始就创建了所有的socket。

通过“sock.setblocking(0)”设置socket为异步模式。

通过unix系统的select俩返回可读取io

最为核心的是26行和29行。尤其是29行的select操作返回待读取socket的列表。

希望与广大网友互动??

点此进行留言吧!

高并发 python socket send 异步_在Python中使用异步Socket编程性能测试相关推荐

  1. 从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步

    本文原题"从小白到高手,你需要理解同步与异步",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线 ...

  2. 自学python能干什么工作_自学python能干什么

    Python是一种广泛使用的高级编程语言,属于通用型编程语言,是完全面向对象的语言.函数.模块.数字.字符串都是对象.经常被用于Web开发.GUI开发.操作系统.科学计算等应用范围. Python 是 ...

  3. 高并发内存占用持续下降_高并发性能调试经验分享

    引文 4月份的时候看到一道面试题,据说是腾讯校招面试官提的:在多线程和高并发环境下,如果有一个平均运行一百万次才出现一次的bug,你如何调试这个bug?知乎原贴地址如下:腾讯实习生面试,这两道题目该怎 ...

  4. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

  5. 服务器高并发时请求报错_基于redis的分布式锁防止高并发重复请求

    需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. ( ...

  6. python简单图形输出_基于 Python Matplotlib 模块的高质量图形输出

    Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric 及 Numarray,克隆了许多 M ...

  7. 【高并发服务器】send、sendto以及recv、recvfrom区别小结

    0x00 前言 文章中的文字可能存在语法错误以及标点错误,请谅解: 如果在文章中发现代码错误或其它问题请告知,感谢! 系统版本:Ubuntu 14.04_64 最后更新:2022-04-28 0x01 ...

  8. python 控制有线网卡_在Python中用socket捕获指定网卡的流量

    本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! 指定连接到Internet的网卡: Get the IP address for the inte ...

  9. python使用redis队列_【Python】python使用redis做队列服务

    系统中引入消息队列机制是对系统一个非常大的改善.例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中.你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样可能会因为网络的不确 ...

最新文章

  1. 谷歌大脑联手Hinton提出SimCLR新框架,疯狂提升自监督学习性能 | 北邮毕业生一作...
  2. 博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
  3. 简单三步,用 Python 发邮件
  4. 韩国最新「美女元宇宙」引爆Reddit!最强换脸神器美女自拍一键转漫画
  5. 【AI视野·今日CV 计算机视觉论文速览 第190期】Fri, 9 Apr 2021
  6. 【Nacos】Nacos MySQL 配置后无法登录 愚蠢的问题
  7. 10_android打包的过程
  8. bzoj 4300绝世好题
  9. python turtle绘图
  10. 在职研究生论文如何查重?
  11. win7 计算机登录用户名和密码忘记,电脑win7登陆密码忘记了怎么办_win7忘记登陆密码如何进入-win7之家...
  12. 苹果个人开发者账号出售_苹果开发者账号被调查血泪史总结
  13. 项目管理练习1577628224
  14. java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署(2)
  15. 线上连锁线下整合 连锁店电商解决方案
  16. 按键精灵移动端系列 - IOS(苹果版)安装1.3.8 deb 下载地址
  17. unity GC机制简单介绍
  18. 简单抽奖机系统(中午吃什么?)
  19. DCB value for SVN 77 not found on dcb.dat
  20. 微信小程序 Basic Auth 前后端restful api进行身份验证

热门文章

  1. Python 中的闭包、匿名函数、decorator 装饰器与python的偏函数
  2. 什么是 JavaScript 世界的 UMD
  3. 让 fork 出来的 Github 仓库从远端仓库拖取最新的修改
  4. SAP Spartacus breakpoint的决定逻辑
  5. Angular里使用createEmbeddedView动态加入新的模板元素
  6. Angular 条件指令 ngIf 的一个例子
  7. 如何使用Angular的@Input()装饰器
  8. 如何将Java工程导出成可以执行的jar
  9. 脑部手术成功,只是万里长征走完了第一步
  10. SAP Engagement Center的ShellCarousel控件control