国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

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

2020-02-23 05:29:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

OK,首先寫(xiě)一個(gè)python socket的server段,對(duì)開(kāi)放三個(gè)端口:10000,10001,10002.krondo的例子中是每個(gè)server綁定一個(gè)端口,測(cè)試的時(shí)候需要分別開(kāi)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,沒(méi)有才用異步網(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可以立即開(kāi)始讀取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             
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 河北省| 句容市| 介休市| 乐昌市| 岑巩县| 上饶县| 吉木乃县| 泾阳县| 张家界市| 平乡县| 社旗县| 揭西县| 乃东县| 图们市| 沾益县| 双鸭山市| 金堂县| 乌鲁木齐市| 开封县| 淄博市| 昌平区| 楚雄市| 洪洞县| 封丘县| 温泉县| 漳州市| 咸宁市| 波密县| 公主岭市| 桂阳县| 涪陵区| 道真| 闻喜县| 敖汉旗| 平谷区| 乌拉特后旗| 巩留县| 黄平县| 大冶市| 北流市| 靖远县|