欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

在Python中使用異步Socket編程性能測試

系統(tǒng) 1656 0

OK,首先寫一個python socket的server段,對開放三個端口:10000,10001,10002.krondo的例子中是每個server綁定一個端口,測試的時候需要分別開3個shell,分別運(yùn)行.這太麻煩了,就分別用三個Thread來運(yùn)行這些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會故意每發(fā)送一個單詞后等待一秒鐘后再發(fā)送另一個單詞 
  
  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,沒有才用異步網(wǎng)絡(luò),連接這個三個端口的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: 
    #運(yùn)用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 
          

結(jié)果只需要4秒就完成了讀取任務(wù)。效率是剛才同步socket的三倍。對客戶端的異步改造主要有兩點(diǎn):

同步模式下,客戶端分別創(chuàng)建socket;而在異步模式下,client開始就創(chuàng)建了所有的socket。
通過“sock.setblocking(0)”設(shè)置socket為異步模式。
通過Unix系統(tǒng)的select倆返回可讀取IO
最為核心的是26行和29行。尤其是29行的select操作返回待讀取socket的列表。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中国明星一级毛片免费 | 久久视屏这里只有精品6国产 | 欧美日韩中文字幕在线观看 | 影音先锋亚洲资源 | avbobo在线 | 欧美激烈精交gif动态图18p | 日韩在线不卡一区 | 天天干天天天天 | 国产一卡二卡三卡 | 99热新 | 天干天夜啪天天碰 | 亚洲色图欧美色 | 99久久99热这里只有精品 | 日本中文字幕电影 | 天堂在线v | 福利视频中文在线观看 | 亚洲欧美在线观看 | 妞干网在线免费观看 | 欧美另类视频在线 | 欧美综合图区亚欧综合图区 | 亚洲成人一区二区三区 | 豆国产97在线 | 亚洲 | 久在线视频 | 狠狠色噜噜狠狠狠狠2018 | 这里只有精品999 | 亚洲精品综合一区二区三 | 成人免费a视频 | 日日麻批免费视频 | 奇米色吧 | 比比资源先锋影音网 | 爱视频福利网 | 国产激情久久久久久熟女老人AV | 日韩伦理一区 | 免费污视频| 大ji巴好好爽好深网站 | 天堂av资源| 亚洲一二三区精品 | 国产精品毛片一区二区在线看 | 日日拍夜夜嗷嗷叫视频 | 精品久久一区二区 | 亚洲一区二区三区高清 |