激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久艳片 | 国产精品一区2区3区 | 国产女王女m视频vk 毛片免费在线视频 | 成人午夜亚洲 | 欧美一区中文字幕 | 国产一区二区三区视频免费 | 久久经典国产视频 | 欧美日韩电影在线 | 亚洲成人免费网站 | 日韩黄色片网站 | 性欧美大战久久久久久久免费观看 | 免费黄色短视频网站 | 日本一级黄色毛片 | 久久视频精品 | 92看片淫黄大片一级 | 欧美成人三级大全 | 国产视频软件在线 | 斗破苍穹在线观看免费完整观看 | 日本韩国欧美一级片 | 欧美亚洲一区二区三区四区 | 精品国内视频 | 久久久久国产成人精品亚洲午夜 | 狠狠干91| 欧美a区 | 午夜精品一区二区三区免费 | 精品国产一区二区三区四区在线 | 黄色网页在线看 | 成年男女免费视频 | 久久毛片免费 | 国内精品久久久久久2021浪潮 | 国产亚洲精品综合一区 | 国产精品久久久久久久av | 毛片免费观看视频 | 极品五月天| 欧美成人高清在线 | 一区二区三视频 | 黄色毛片视频在线观看 | 免费1级做55爰片l在线观看 | 成年人免费高清视频 | 日韩精品中文字幕一区二区 | 人人舔人人舔 |