IO_多路復(fù)用_select_epool模式

select_socket_server簡單實(shí)例
importselect,socket,queue

server=socket.socket()

server.bind(('localhost',9000))
server.listen(1000)

server.setblocking(False)#設(shè)置非阻塞模式

inputs=[server,]
#inputs=[server,conn] #[conn,]
#inputs=[server,conn,conn2] #[conn2,]
outputs=[]
while True:
    readable,writeable,exceptional=select.select(inputs,outputs,inputs)#select監(jiān)測server連接  返回三個數(shù)據(jù)
    print(readable,writeable,exceptional)
    forrinreadable:
        ifrisserver:#代表來了一個新連接 下一次select
            conn,addr=server.accept()
            print("來了一個新連接:",addr)
            inputs.append(conn)#是因?yàn)檫@個新建立的連接還沒發(fā)數(shù)據(jù)過來,現(xiàn)在就接收的話程序就報錯了,
            #所以要想實(shí)現(xiàn)這個客戶端發(fā)數(shù)據(jù)來時server端能知道,就需要讓select在監(jiān)測這個conn
        else:#如果不是新連接,是之前那個conn 就接收數(shù)據(jù) 下一次select
            data=r.recv(1024)
            print("收到數(shù)據(jù):",data)
            data1=(str(data.decode("utf-8")).upper()).encode()
            r.send(data1)
            print("send done...")

創(chuàng)新互聯(lián)是專業(yè)的青羊網(wǎng)站建設(shè)公司,青羊接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行青羊網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

10年積累的成都做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有朝陽縣免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

 

 

有隊(duì)列的select_socket_server實(shí)例
importselect,socket,queue

server=socket.socket()

server.bind(('localhost',9000))
server.listen(1000)

server.setblocking(False)#設(shè)置非阻塞模式

msg_dic={}

inputs=[server,]
#inputs=[server,conn] #[conn,]
#inputs=[server,conn,conn2] #[conn2,]
outputs=[]#r
#outputs=[r1,]
while True:
    readable,writeable,exceptional=select.select(inputs,outputs,inputs)#select監(jiān)測server連接  返回三個數(shù)據(jù)
    print(readable,writeable,exceptional)#outputs 放啥下一次就出啥 下一次循環(huán)的時候就返回了
    forrinreadable:
        ifrisserver:#代表來了一個新連接 下一次select
            conn,addr=server.accept()
            print("來了一個新連接:",addr)
            inputs.append(conn)#是因?yàn)檫@個新建立的連接還沒發(fā)數(shù)據(jù)過來,現(xiàn)在就接收的話程序就報錯了,
            #所以要想實(shí)現(xiàn)這個客戶端發(fā)數(shù)據(jù)來時server端能知道,就需要讓select在監(jiān)測這個conn
            msg_dic[conn]=queue.Queue()#初始化一個隊(duì)列,后面存要返回給這個客戶端的數(shù)據(jù)

        else:#如果不是新連接,是之前那個conn 就接收數(shù)據(jù) 下一次select
            data=r.recv(1024)
            print("收到數(shù)據(jù):",data)
            msg_dic[r].put(data)#往隊(duì)列里面扔數(shù)據(jù) 等于字典里添加values

            outputs.append(r)#放入返回的連接隊(duì)列里
            #r.send(data)
            #print("send done...")

    forwinwriteable:#要返回給客戶端的連接列表
        data_to_client=msg_dic[w].get()#返回給這個客戶端的數(shù)據(jù) 取隊(duì)列里面的數(shù)據(jù) 相當(dāng)于取字典里面的values
        w.send(data_to_client)#返回給客戶端的源數(shù)據(jù)

        outputs.remove(w)#確保下次循環(huán)的時候writeable,不返回已經(jīng)處理完的連接

    foreinexceptional:#連接已經(jīng)斷開,異常處理
        ifeinoutputs:
            outputs.remove(e)#清理已經(jīng)斷開的連接

        inputs.remove(e)#清理已經(jīng)斷開的連接

        delmsg_dic[e]#清理已經(jīng)斷開的連接

 

 

支持大并發(fā)的selectors模塊
importselectors
importsocket

sel = selectors.DefaultSelector()


defaccept(sock,mask):#相當(dāng)于server.accept()
    conn, addr = sock.accept()  # Should be ready
    print('accepted', conn,'from', addr)
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read)#新連接注冊read回調(diào)函數(shù)


defread(conn, mask):#操作
    data = conn.recv(1024)  # Should be ready
    ifdata:
        print('echoing',repr(data),'to', conn,mask)
        conn.send(data)  # Hope it won't block
    else:
        print('closing', conn)
        sel.unregister(conn)
        conn.close()


sock = socket.socket()
sock.bind(('localhost',10000))
sock.listen(1000)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    events = sel.select()#看系統(tǒng)支持 select或 epool 默認(rèn)阻塞 有活動連接就返回活動的連接列表
    forkey, maskinevents:
        callback = key.data#accept
        callback(key.fileobj, mask)#key.fileobj=文件句柄

 


多路連接socket_client
#_*_coding:utf-8_*_
__author__ ='Alex Li'


import
socket
importsys

messages = [b'This is the message. ',
             b'It will be sent ',
             b'in parts.',
             ]
server_address = ('localhost',10000)

# Create a TCP/IP socket
socks = [ socket.socket(socket.AF_INET, socket.SOCK_STREAM)foriinrange(100)
          ]

# Connect the socket to the port where the server is listening
print('connecting to %s port %s'% server_address)
forsinsocks:
    s.connect(server_address)

formessageinmessages:

    # Send messages on both sockets
    forsinsocks:
        print('%s: sending "%s"'% (s.getsockname(), message) )
        s.send(message)

    # Read responses on both sockets
    forsinsocks:
        data = s.recv(1024)
        print('%s: received "%s"'% (s.getsockname(), data) )
        if notdata:
            print('closing socket', s.getsockname() )

網(wǎng)頁名稱:IO_多路復(fù)用_select_epool模式
標(biāo)題來源:http://bm7419.com/article30/phdepo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)公司、App開發(fā)建站公司、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司