python 實現多工的四種巧妙的非阻塞伺服器二

2022-05-08 15:24:13 字數 2675 閱讀 6933

第三種非阻塞的伺服器    

import socket

import gevent

from gevent import monkey

monkey.patch_all() #協程的原理就是為了針對阻塞的 第一種方式,通過開程序或者協程的方式來開啟伺服器

from multiprocessing import process

from threading import thread

'''協程是程式,不屬於作業系統的層次'''

class webserver():

def __init__(self):

self.socker=socket.socket(socket.af_inet,socket.sock_stream)

self.socker.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

self.socker.bind(('',8080))

self.socker.listen(128)

def server(self):

while true:

sock,adress = self.socker.accept()

sock.send('你好!'.encode())

print(adress)

# g = gevent.spawn(self.re_server,sock)#協程的方式,不需要任何方法來開啟協程

#gevent.joinall([g])#等待,不等待主程序結束,協程就會結束

# pro = process(target=self.re_server,args=(sock,))

# pro.start()

# sock.close() #由於產生新的程序原來的程序必須關掉

th = thread(target=self.re_server,args=(sock,))#執行緒的方式

th.start()

def re_server(self,sock):

while true:

try:

#會一直接受資料。直至迴圈 但是不能退出,對方停止連線就會報錯,除非異常處理

data = sock.recv(1024).decode()

if data:

print(data)

sock.send('你好!'.encode())

else:

sock.close()

except exception as e:

break #退出裡面的迴圈,

第四種非阻塞伺服器:

import socket

import select

'''epoll 是操作作業系統,來管理'''

class ser():

def __init__(self):

self.socket=socket.socket(socket.af_inet,socket.sock_stream)

self.socket.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)

self.socket.bind(('',8080))

self.socket.listen(128)

self.select_eqoll= select.epoll()

self.select_eqoll.register(self.socket.fileno(),select.epollin)

self.cli_dir=dict()

def server(self):

while true:

#poll 方法是讓作業系統進行掃瞄!,產生乙個列表,列表裡面乙個是fd 乙個是事件!

epoll_list = self.select_eqoll.poll()

for fd,enven in epoll_list:

if fd==self.socket.fileno(): #如果有這個fd 那麼就會建立新的套接字

client,adress=self.socket.accept()

#將新的套接字進行註冊!

self.select_eqoll.register(client.fileno(),select.epollin)

#將新的套接字與字典繫結,為了下一步進行操作

self.cli_dir[client.fileno()]=client #client.fileno() 就是fd

else:

self.kefu(self.cli_dir[fd],fd)

def kefu(self,sock, fd):

while true:

try:

data = sock.recv(1024).decode()

if data:

print(data)

sock.send('你好!'.encode())

else:

self.select_eqoll.unregister(fd)

sock.close()

except exception as e:

break

if __name__ == '__main__':

web=ser()

web.server()

Python 多工之協程(3)實現多工

學習理解迭代器和生成器之後,開始使用協程來實現多工 當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,它的返回值是乙個生成器物件。我們可以使用next 或send 函式來啟動喚醒生成器物件,當程式第一次執行到yield時,程式暫停執行,並返回yield後邊跟的變數,當再次喚醒時,...

多型的四種實現

多型分為兩種 通用的多型和特定的多型。兩者的區別是前者對工作的型別不加限制,允許對不同型別的值執行相同的 後者只對有限數量的型別有效,而且對不同型別的值可能要執行不同的 通用的多型又分為引數多型 parametric 和包含多型 inclusion 特定的多型分為過載多型 overloading 和...

ADT Queue 四種實現

講四種實現 普通陣列模擬佇列實現不講,很輕便也很實用,不難自己隨意寫寫就行 佇列和棧在使用時,即使運算元很多,但一般實時儲存在其中的資料並不多,於是我們採用迴圈佇列的方式來節省空間。那迴圈佇列其實就是,當佇列中申請好的連續空間中已經填滿資料時 並不是指佇列已滿,佇列是只夾在front和rear之間的...