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

2022-09-29 23:03:18 字數 1559 閱讀 3776

在python中使用select與poll比起在c中使用簡單得多。select函式的引數是3個列表,包含整數檔案描述符,nexjeihf或者帶有可返回檔案描述符的fileno()方法物件。第乙個引數是需要等待輸入的物件,第二個指定等待輸出的物件,第三個引數指定異常情況的物件。第四個引數nexjeihf則為設定超時時間,是乙個浮點數。指定以秒為單位的超時值。select函式將會返回一組檔案描述符,包括輸入,輸出以及異常。

在linux下利用select實現多路io的檔案複製程式:

#!/usr/bin/env python

import select

#匯入select模組

blksize=8192

def readwrite(fromfd,tofd):

readbuf = fromfd.read(blksize)

if readbuf:

tofd.write(readbuf)

tofd.flush()

return len(readbuf)

def copy2file(fromfd1,tofd1,fromfd2,tofd2):

''' using select to choice fds'''

totalbytes=0

if not (fromfd1 or fromfd2 or tofd1 or nexjeihftofd2) :

#檢查所有檔案描述符是否合法

return 0

while true:

#開始利用select對輸入所有輸入的檔案描述符進行監視

rs,ws,es = select.select([fromfd1,fromfd2],,)

for r in rs:

if r is fromfd1:

#當第乙個檔案描述符可讀時,讀入資料

bytesread = readwrite(fromfd1,tofd1)

totalbytes += bytesread

if r is fromfd2:

bytesread = readwrite(fromfd2,tofd2)

totalbytes += bytesread

if (bytesread <= 0):

break

return totalbytes

def main():

fromf程式設計客棧d1 = open"/etc/fstab","r")

fromfd2 = open("/etc/passwd","r")

tofd1 = open("/root/fstab","w+")

tofd2 = open("/root/passwd","w+")

totalbytes = copy2file(fromfd1,tofd1,fromfd2,tofd2)

print "number of bytes copied %d\n" % totalbytes

return 0

if __name__=="__main__":

main()

本文標題: python通過select實現非同步io的方法

本文位址:

select的列子說明select內部實現原理

1 select內部是個陣列,而epoll內部結構是紅黑二叉樹 2 select查詢起來慢,而epoll查詢起來快 3 每次迴圈,內部都要發生拷貝 檢視相關 而epoll不需要這樣的操作,也就是初始化一次拷貝 include include include include include int m...

socket 使用select 非阻塞方式實現

select函式原型如下 int select int maxfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout select系統呼叫是用來讓我們的程式監視多個檔案控制代碼 socket 控制代碼 的狀...

通過隱藏option實現select的聯動效果

開始的時候需求是根據一定條件隱藏一部分標籤,類似聯動效果,但是目前的html規範並沒有為提供隱藏的效果,因此常用的設定display或者visibility無效。網上大部分解決方案是刪除節點或置空。這顯然不能夠滿足需求。後來經過試驗,選擇了利用標籤包裝的解決方案,基本原理如下 當需要隱藏的時候,在標...