一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中使用asyncio 封裝文件讀寫

Python中使用asyncio 封裝文件讀寫

2020-09-06 12:06liyiyang Python

本文主要給大家簡單講解如何用 asyncio.Future 對象來封裝文件的異步讀寫。有需要的小伙伴可以參考下

前言

和網絡 IO 一樣,文件讀寫同樣是一個費事的操作。

默認情況下,Python 使用的是系統的阻塞讀寫。這意味著在 asyncio 中如果調用了

?
1
2
f = file('xx')
f.read()

會阻塞事件循環。

本篇簡述如何用 asyncio.Future 對象來封裝文件的異步讀寫。

代碼在 GitHub。目前僅支持 Linux。

阻塞和非阻塞

首先需要將文件的讀寫改為非阻塞的形式。在非阻塞情況下,每次調用 read 都會立即返回,如果返回值為空,則意味著文件操作還未完成,反之則是讀取的文件內容。

阻塞和非阻塞的切換與操作系統有關,所以本篇暫時只寫了 Linux 版本。如果有過 Unix 系統編程經驗,會發現 Python 的操作是類似的。

?
1
2
3
flag = fcntl.fcntl(self.fd, fcntl.F_GETFL)
if fcntl.fcntl(self.fd, fcntl.F_SETFL, flag | os.O_NONBLOCK) != 0:
  raise OSError()

Future 對象

Future 對象類似 Javascript 中的 Promise 對象。它是一個占位符,其值會在將來被計算出來。我們可以使用

result = await future

在 future 得到值之后返回。而使用

future.set_result(xxx)

就可以設置 future 的值,也意味著 future 可以被返回了。await 操作符會自動調用 future.result() 來得到值。

loop.call_soon

通過 loop.call_soon 方法可以將一個函數插入到事件循環中。

至此,我們的異步文件讀寫思路也就出來了。通過 loop.call_soon 調用非阻塞讀寫文件的函數。若一次文件讀寫沒有完成,則計算剩余所學讀寫的字節數,并再次插入事件循環直至讀寫完畢。

可以發現其就是把傳統 Unix 編程里,非阻塞文件讀寫的 while 循環換成了 asyncio 的事件循環。

下面是這一過程的示意代碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def read_step(self, future, n, total):
  res = self.fd.read(n)
  if res is None:
    self.loop.call_soon(self.read_step, future, n, total)
    return
  if not res: # EOF
    future.set_result(bytes(self.rbuffer))
    return
  self.rbuffer.extend(res)
  self.loop.call_soon(self.read_step, future, self.BLOCK_SIZE, total)
 
def read(self, n=-1):
  future = asyncio.Future(loop=self.loop)
 
  self.rbuffer.clear()
  self.loop.call_soon(self.read_step, future, min(self.BLOCK_SIZE, n), n)
 
  return future

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲zooz人禽交xxxx | 亚洲天堂男人的天堂 | 午夜神器老司机高清无码 | 黑人video粗暴日本 | 久久精品国产色蜜蜜麻豆国语版 | 亚飞与亚基国语1080p在线观看 | 护士伦理片 | 被老外操| 国自产精品手机在线视频 | 精品午夜中文字幕熟女人妻在线 | ferr孕妇videos毛茸茸 | 久久久久久久尹人综合网亚洲 | 激情小说色图 | 91色资源网在线观看 | 亚洲黄色片免费看 | 3d动漫美女被吸乳羞羞视频 | 久久免费看少妇高潮A片2012 | 男女性gif抽搐出入视频 | 3d美女触手怪爆羞羞漫画 | 女女宿舍互慰h文小说 | 大ji吧快给我别停受不了视频 | 国产caoni555在线观看 | 香蕉 在线播放 | 国产视频一区在线观看 | xxx美国 | 四虎免费影院4hu永久免费 | 手机看片1024国产 | 狐媚小说 | 亚洲AV久久无码精品九号软件 | 红怡院欧洲| 深夜影院a| 亚洲欧美日韩精品高清 | 日韩久久网 | 日本美女视频韩国视频网站免费 | 亚洲第一人黄所 | 国产三级精品91三级在专区 | ffyybb免费福利视频 | 和肥岳在厨房激情 | 我和老丈洗澡同性 | 皇上好大好硬好涨好深好爽 | 国产精品成人网红女主播 |