在Python中使用异步Socket编程性能测试_python

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
异步
socket异步编程、c socket异步编程、socket非阻塞异步编程、java socket异步编程、vb6 socket 异步编程,以便于您获取更多的相关知识。

时间: 2024-12-09 09:07:28

在Python中使用异步Socket编程性能测试_python的相关文章

在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分

编程|网络|异步 ///////////////////////////////////////////////////////////////////////////////////////////* 标题:在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分 当看到.NET中TcpListener和TcpClient的时候,我非常高兴,那就是我想要的通讯模式但是使用之后发现它们的力量太单薄了,我们需要一个更好的类库来替代它们. 下面提供了一些类,可以

介绍Python中的一些高级编程技巧_python

 正文: 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数据一致性的要求或是对索引的要求等,同时也可以将各种数据结构合适地结合在一起,从而生成具有逻辑性并易于理解的数据模型.Python的数据结构从句法上来看非常直观,并且提供了大量的可选操作.这篇指南尝试将大部分常用的数据结构知识放到一起,并且提供对其最佳用法的探讨.推导式(Comprehensions) 如果你已经使用了很长时间的Python,那么你至少应该听

谁知道python中urllib2与socket区别

问题描述 谁知道python中urllib2与socket区别 请问一下python中urllib2与socket的区别?我知道他们分别怎么用,也明白URLlib2用于网络,socket套接字用于服务器与客服端,但是他们俩分别都有什么区别和共同点呢?是否可以相互替换 解决方案 urllib2主要用来进行HTTP相关的web请求等socket则更底层,可以支持tcp,udp数据包发送.

Python 中的异步编程:Asyncio

异步是怎么一回事? 在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行.此类代码的输出容易显现和预测. 但是- 譬如说你有一个脚本向3个不同服务器请求数据. 有时,谁知什么原因,发送给其中一个服务器的请求可能意外地执行了很长时间.想象一下从第二个服务器获取数据用了10秒钟.在你等待的时候,整个脚本实际上什么也没干.如果你可以写一个脚本可以不去等待第二个请求而是仅仅跳过它,然后开始执行第三个请求,然后回到第二个请求,执行之前离开的位置会怎么样呢.就是这样.你通过切换任务最小化了空转时间.尽

Python中的异步编程:Asyncio

如果你已经决定要理解 Python 的异步部分,欢迎来到我们的"Asyncio How-to ". 注:哪怕连异动范式的存在都不知道的情况下,你也可以成功地使用 Python.但是,如果你对底层运行模式感兴趣的话,asyncio 绝对值得查看. 异步是怎么一回事? 在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行.此类代码的输出容易显现和预测. 但是- 譬如说你有一个脚本向3个不同服务器请求数据. 有时,谁知什么原因,发送给其中一个服务器的请求可能意外地执行了很长时间.想象一

Python中字符串的处理技巧分享_python

一.如何拆分含有多种分隔符的字符串? 实际案例 我们要把某个字符串依据分隔符号拆分不同的字符段,该字符串包含多种不同的分隔符,例如: s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd' 其中<,>,<;>,<|>,<\t>都是分隔符,如何处理? 解决方案 连续使用split()方法,每次处理一种分隔符 # 使用Python2 def mySplit(s,ds): res = [s] for d

python中range()与xrange()用法分析_python

本文实例讲述了python中range()与xrange()用法.分享给大家供大家参考,具体如下: 据说range比xrange开销要大,原因是range会直接生成一个list对象,而xrange每次调用返回其中的一个值(参考:http://www.jb51.net/article/50072.htm).于是好奇做了个小小的测试,比较两个函数性能到底有多大差别. (1)测试代码 #!/usr/bin/env python from datetime import * def test_range

python中 ? : 三元表达式的使用介绍_python

(1) variable = a if exper else b(2)variable = (exper and [b] or [c])[0](2) variable = exper and b or c 上面三种用法都可以达到目的,类似C语言中 variable = exper ? b : c;即:如果exper表达式的值为true则variable = b,否则,variable = c 例如: 复制代码 代码如下: a,b=1,2max = (a if a > b else b)max =

Python中的闭包实例详解_python

一般来说闭包这个概念在很多语言中都有涉及,本文主要谈谈python中的闭包定义及相关用法.Python中使用闭包主要是在进行函数式开发时使用.详情分析如下: 一.定义 python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).这个定义是相对直白的,好理解的,不像其他定义那样学究味道十足(那些学究味道重的解释,在对一个名词的解释过程中又充满了一堆让人抓狂的其他陌生名词,不适合初学者).下面