協程和IO模型

2022-08-05 13:54:19 字數 1885 閱讀 2133

協程

1.什麼是協程

單執行緒實現併發

在應用程式裡控制多個任務的切換+儲存狀態

優點:應用程式級別速度要遠遠高於作業系統的切換

缺點:多個任務一旦有一個阻塞沒有切,整個執行緒都阻塞在原地

該執行緒內的其他的任務都不能執行了

一旦引入協程,就需要檢測單執行緒下所有的io行為,實現遇到io就切換,少一個         都不行,因為一旦一個任務阻塞了,整個執行緒就阻塞了,其他的任務即便是可以計算,         但是也無法執行了

2.協程的目的:

想要在單執行緒下實現併發

併發指的是多個任務看起來是同時執行的

併發 = 切換+儲存狀態

3.協程的應用

from gevent import

monkey,spawn;monkey.patch_all()

from threading import

current_thread

import

time

defeat():

print('

%s eat 1

' %current_thread().name)

time.sleep(3)

print('

%s eat 2

' %current_thread().name)

defplay():

print('

%s play 1

' %current_thread().name)

time.sleep(1)

print('

%s play 2

' %current_thread().name)

g1=spawn(eat,)

g2=spawn(play,)

print

(current_thread().name)

g1.join()

g2.join()

io模型

recvfrom:

wait data:等待客戶端產生資料-->客戶端os-->網路-->服務端作業系統

copy data:由本地作業系統快取中的資料拷貝到應用程式的記憶體中

send:

copy data

非阻塞io模型

import

socket

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

server.bind((

'127.0.0.1

',8080))

server.listen(5)

server.setblocking(false)

conn_list =

while

true:

try:

print('

當前連線數%s

'%len(conn_list))

conn,client_addr =server.accept()

print('

連線成功')

except

blockingioerror:

del_conn =

for i in

conn_list:

try:

msg = i.recv(1024)

if len(msg) ==0:

continue

i.send(msg.upper())

except

blockingioerror:

pass

except

connectionreseterror:

for i in

del_conn:

conn_list.remove(i)

Python IO模型

比如,你新買了一臺電腦,我們開機發現,連執行都執行不了,我們買的只是一堆硬體,要想讓電腦執行起來, 靠的就是作業系統,作業系統就是操作軟體的軟體,不僅能操作軟體,還能操控硬體。 核心態,就是留給作業系統專用,而使用者的程序是不可以在,核心裡執行的。 而使用者態就是,我們的程序了,比如360,qq,pyc...

Linux IO模型

io操作不外乎讀和寫,但是不同場景對讀寫有不同的需求,例如網路中同時監控多個檔案控制代碼,例如關鍵資料希望一路刷到儲存裝置而不是扔到cache就返回。 怎麼讀,怎麼寫,等不等結果返回,是否等獲取到資料才發返回,組成了不同的io模型,分別適用於不同的場景。 根據同步與非同步,阻塞與非阻塞,可以把io模型如下...

IO模型 IO多路複用

用socket 一定會用到accept recv recvfrom這些方法 正常情況下 accept recv recvfrom都是阻塞的...