Python通過poll實(shí)現(xiàn)異步IO的方法
本文實(shí)例講述了Python通過poll實(shí)現(xiàn)異步IO的方法。分享給大家供大家參考。具體分析如下:
在使用poll()后返回輪詢對(duì)象,該對(duì)象支持以下方法:
pollObj.register(fd,[,eventmask])第一個(gè)參數(shù)是注冊(cè)新的文件描述符fd,fd要么是一個(gè)整數(shù)文件描述符,要么可以帶有一個(gè)獲取文件描述符的fileno()方法的對(duì)象。eventmask是一些按位或標(biāo)記,這些標(biāo)記指示要處理的事件。
POLLIN: 用于讀取數(shù)據(jù)
POLLPRI: 用于讀取緊急數(shù)據(jù)
POLLOUT: 準(zhǔn)備寫入
POLLERR: 錯(cuò)誤情況
POLLHUP: 保持狀態(tài)
POLLNVAL: 無效請(qǐng)求
最后在循環(huán)中利用pollObj.poll()來進(jìn)行對(duì)已注冊(cè)的文件描述符進(jìn)行輪詢。返回一元祖(fd,event)。其中fd是文件描述符,event是指示時(shí)間的位掩碼。至需要將event與對(duì)應(yīng)的時(shí)間進(jìn)行&測(cè)試即可。
利用poll創(chuàng)建對(duì)一個(gè)多路文件復(fù)制程序,代碼如下:
#!/usr/bin/env python
import select
BLKSIZE=8192
def readwrite(fromfd,tofd):
readbuf = fromfd.read(BLKSIZE)
if readbuf:
tofd.write(readbuf)
tofd.flush()
return len(readbuf)
def copyPoll(fromfd1,tofd1,fromfd2,tofd2):
#定義需要監(jiān)聽的事件
READ_ONLY = (select.POLLIN |
select.POLLPRI |
select.POLLHUP |
select.POLLERR )
totalbytes=0
if not (fromfd1 or fromfd2 or tofd1 or tofd2) :
return 0
fd_dict = {fromfd1.fileno():fromfd1,fromfd2.fileno():fromfd2}
#創(chuàng)建poll對(duì)象p
p=select.poll()
#利用poll對(duì)象p對(duì)需要監(jiān)視的文件描述符進(jìn)行注冊(cè)
p.register(fromfd1,READ_ONLY)
p.register(fromfd2,READ_ONLY)
while True:
#輪詢已經(jīng)注冊(cè)的文件描述符是否已經(jīng)準(zhǔn)備好
result = p.poll()
if len(result) != 0:
for fd,events in result:
if fd_dict[fd] is fromfd1:
if events & (select.POLLIN|select.POLLPRI):
bytesread = readwrite(fromfd1,tofd1)
totalbytes+=bytesread
elif events & (select.POLLERR):
p.unregister(fd_dict[fd])
if fd_dict[fd] is fromfd2:
if events & (select.POLLIN|select.POLLPRI):
bytesread = readwrite(fromfd2,tofd2)
totalbytes+=bytesread
elif events & (select.POLLERR):
p.unregister(fd_dict[fd])
if bytesread <= 0:
break
return totalbytes
def main():
fromfd1 = open("/etc/fstab","r")
fromfd2 = open("/root/VMwareTools-8.8.1-528969.tar.gz","r")
tofd1 = open("/root/fstab","w+")
tofd2 = open("/var/passwd","w+")
totalbytes = copyPoll(fromfd1,tofd1,fromfd2,tofd2)
print "Number of bytes copied %d\n" % totalbytes
return 0
if __name__=="__main__":
main()
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python實(shí)現(xiàn)生成Word、docx文件的方法分析
這篇文章主要介紹了python實(shí)現(xiàn)生成Word、docx文件的方法,結(jié)合實(shí)例形式分析了Python使用docx模塊操作word文件與docx文件的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-08-08
Python控制臺(tái)輸出時(shí)刷新當(dāng)前行內(nèi)容而不是輸出新行的實(shí)現(xiàn)
今天小編就為大家分享一篇Python控制臺(tái)輸出時(shí)刷新當(dāng)前行內(nèi)容而不是輸出新行的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法
這篇文章主要介紹了python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法,實(shí)例分析了Python使用pil模塊進(jìn)行圖片處理的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
python中ransac算法擬合圓的實(shí)現(xiàn)
RANSAC是一種用于從包含異常數(shù)據(jù)的樣本數(shù)據(jù)集中計(jì)算數(shù)學(xué)模型參數(shù)的算法,本文主要介紹了python中ransac算法擬合圓的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Python?pandas找出、刪除重復(fù)的數(shù)據(jù)實(shí)例
在面試中很可能遇到給定一個(gè)含有重復(fù)元素的列表,刪除其中重復(fù)的元素,下面這篇文章主要給大家介紹了關(guān)于Python?pandas找出、刪除重復(fù)數(shù)據(jù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

