日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2023/12/19 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高并发 python socket send 异步_在Python中使用异步Socket编程性能测试 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

同步模式下,客戶端分別創(chuàng)建socket;而在異步模式下,client開(kāi)始就創(chuàng)建了所有的socket。

通過(guò)“sock.setblocking(0)”設(shè)置socket為異步模式。

通過(guò)unix系統(tǒng)的select倆返回可讀取io

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

希望與廣大網(wǎng)友互動(dòng)??

點(diǎn)此進(jìn)行留言吧!

總結(jié)

以上是生活随笔為你收集整理的高并发 python socket send 异步_在Python中使用异步Socket编程性能测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。