python實現自己的非同步IO等非同步操作

2021-08-17 06:47:11 字數 1480 閱讀 7125

首先引用下廖雪峰老師**上的這部分介紹:

協程,又稱微執行緒,纖程。英文名coroutine。

協程的概念很早就提出來了,但直到最近幾年才在某些語言(如lua)中得到廣泛應用。

子程式,或者稱為函式,在所有語言中都是層級呼叫,比如a呼叫b,b在執行過程中又呼叫了c,c執行完畢返回,b執行完畢返回,最後是a執行完畢。

所以子程式呼叫是通過棧實現的,乙個執行緒就是執行乙個子程式。

子程式呼叫總是乙個入口,一次返回,呼叫順序是明確的。而協程的呼叫和子程式不同。

協程看上去也是子程式,但執行過程中,在子程式內部可中斷,然後轉而執行別的子程式,在適當的時候再返回來接著執行。

注意,在乙個子程式中中斷,去執行其他子程式,不是函式呼叫,有點類似cpu的中斷。比如子程式a、b:

看完了廖老師的介紹後,用sleep函式確實是可以實現非同步的過程,那麼問題來了,如果需要實現自己的非同步操作,應該怎麼實現呢,在網上找了很多關於非同步io的例子,百分之九十都是幾個例子互相引用來引用去,最終在stackoverflow上找到了乙個可用的方法,以下給出示例**

import asyncio

import time

defret

(a):

time.sleep(3)

return a

async def

get_text

(index_url):

try:

print(index_url,",","1")

loop = asyncio.get_event_loop()

# 主要在這

resp = await loop.run_in_executor(none, ret, index_url)

print(index_url,",","2","-",resp)

except exception as err:

# 出現異常重試

print(err)

traceback.print_exc()

return

none

return resp

tasks =

for i in range(0, 3):

# 獲取eventloop:

loop = asyncio.get_event_loop()

# 執行coroutine

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

主要的部分就是resp = await loop.run_in_executor(none, ret, index_url)這一行,可以指定自己需要的函式 放入訊息迴圈中,例如,爬蟲類的,這個ret函式就可換成requests.get,以下為執行結果:

1 , 1

2 , 1

0 , 1

1 , 2 - 1

2 , 2 - 2

0 , 2 - 0

Python通過select實現非同步IO的方法

在python中使用select與poll比起在c中使用簡單得多。select函式的引數是3個列表,包含整數檔案描述符,nexjeihf或者帶有可返回檔案描述符的fileno 方法物件。第乙個引數是需要等待輸入的物件,第二個指定等待輸出的物件,第三個引數指定異常情況的物件。第四個引數nexjeihf...

nodejs非同步IO的實現

nodejs的核心之一就是非阻塞的非同步io,於是想知道它是怎麼實現的,挖了下nodejs原始碼,找到些答案,在此跟大家分享下。首先,我用了一段js test fs read.js做測試,如下 var path require path fs require fs filepath path.joi...

Python之非同步IO模型實現socket併發

服務端 import socket sk socket.socket addr 127.0.0.1 8090 sk.bind addr sk.listen sk.setblocking false 設定非阻塞模式,accept,recv等方法均不阻塞,而是丟擲異常 conn lst 建立乙個列表儲存...