亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Python中使用異步Socket編程性能測(cè)試

 更新時(shí)間:2014年06月25日 12:10:48   投稿:hebedich  
異步網(wǎng)絡(luò)據(jù)說能極大的提高網(wǎng)絡(luò)server的連接速度,所以打算寫一個(gè)專題,來(lái)學(xué)習(xí)和了解異步網(wǎng)絡(luò).因?yàn)镻ython有個(gè)非常出名的異步Lib:Twisted,所以就用Python來(lái)完成.

OK,首先寫一個(gè)python socket的server段,對(duì)開放三個(gè)端口:10000,10001,10002.krondo的例子中是每個(gè)server綁定一個(gè)端口,測(cè)試的時(shí)候需要分別開3個(gè)shell,分別運(yùn)行.這太麻煩了,就分別用三個(gè)Thread來(lái)運(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會(huì)故意每發(fā)送一個(gè)單詞后等待一秒鐘后再發(fā)送另一個(gè)單詞 
  
  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會(huì)被Python完全占用了 
    pass 

下面是一個(gè)client,沒有才用異步網(wǎng)絡(luò),連接這個(gè)三個(gè)端口的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來(lái)讀取,代碼如下:

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來(lái)確保那些可讀取的異步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的三倍。對(duì)客戶端的異步改造主要有兩點(diǎn):

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

相關(guān)文章

  • Python驗(yàn)證的50個(gè)常見正則表達(dá)式

    Python驗(yàn)證的50個(gè)常見正則表達(dá)式

    這篇文章主要給大家介紹了關(guān)于利用Python驗(yàn)證的50個(gè)常見正則表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python3序列化與反序列化用法實(shí)例

    python3序列化與反序列化用法實(shí)例

    這篇文章主要介紹了python3序列化與反序列化用法,實(shí)例分析了Python3使用pickle模塊針對(duì)字符串進(jìn)行序列化操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例

    用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例

    下面小編就為大家分享一篇用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-04-04
  • django數(shù)據(jù)模型(Model)的字段類型解析

    django數(shù)據(jù)模型(Model)的字段類型解析

    這篇文章主要介紹了django數(shù)據(jù)模型(Model)的字段類型,文中給大家提到了django數(shù)據(jù)模型on_delete, db_constraint的使用,需要的朋友可以參考下
    2019-12-12
  • 使用pycharm將自己項(xiàng)目代碼上傳github(小白教程)

    使用pycharm將自己項(xiàng)目代碼上傳github(小白教程)

    github是一個(gè)代碼托管平臺(tái),本文主要介紹了使用pycharm將自己項(xiàng)目代碼上傳github,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Python selenium 自動(dòng)化腳本打包成一個(gè)exe文件(推薦)

    Python selenium 自動(dòng)化腳本打包成一個(gè)exe文件(推薦)

    這篇文章主要介紹了Python selenium 自動(dòng)化腳本打包成一個(gè)exe文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Django實(shí)現(xiàn)上傳圖片功能

    Django實(shí)現(xiàn)上傳圖片功能

    這篇文章為大家詳細(xì)主要介紹了Django實(shí)現(xiàn)上傳圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • python之從文件讀取數(shù)據(jù)到list的實(shí)例講解

    python之從文件讀取數(shù)據(jù)到list的實(shí)例講解

    下面小編就為大家分享一篇python之從文件讀取數(shù)據(jù)到list的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-04-04
  • 如何更改jupyter的默認(rèn)文件路徑

    如何更改jupyter的默認(rèn)文件路徑

    這篇文章主要介紹了如何更改jupyter的默認(rèn)文件路徑問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 一文深入學(xué)習(xí)Python中的os.listdir函數(shù)

    一文深入學(xué)習(xí)Python中的os.listdir函數(shù)

    這篇文章主要給大家介紹了關(guān)于Python中os.listdir函數(shù)的相關(guān)資料,os.listdir是 Python中的一個(gè)函數(shù),它的意思是返回指定目錄下的文件和文件夾的名稱的列表,需要的朋友可以參考下
    2023-10-10

最新評(píng)論