第三種非阻塞的伺服器
import socketimport 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 socketimport 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之間的...