最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中使用asyncio 封裝文件讀寫

 更新時間:2016年09月11日 09:51:48   作者:liyiyang  
本文主要給大家簡單講解如何用 asyncio.Future 對象來封裝文件的異步讀寫。有需要的小伙伴可以參考下

前言

和網(wǎng)絡(luò) IO 一樣,文件讀寫同樣是一個費事的操作。

默認(rèn)情況下,Python 使用的是系統(tǒng)的阻塞讀寫。這意味著在 asyncio 中如果調(diào)用了

f = file('xx')
f.read()

會阻塞事件循環(huán)。

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

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

阻塞和非阻塞

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

阻塞和非阻塞的切換與操作系統(tǒng)有關(guān),所以本篇暫時只寫了 Linux 版本。如果有過 Unix 系統(tǒng)編程經(jīng)驗,會發(fā)現(xiàn) Python 的操作是類似的。

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)

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

loop.call_soon

通過 loop.call_soon 方法可以將一個函數(shù)插入到事件循環(huán)中。

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

可以發(fā)現(xiàn)其就是把傳統(tǒng) Unix 編程里,非阻塞文件讀寫的 while 循環(huán)換成了 asyncio 的事件循環(huán)。

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

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

相關(guān)文章

  • python根據(jù)字典的鍵來刪除元素的方法

    python根據(jù)字典的鍵來刪除元素的方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python根據(jù)字典的鍵來刪除元素的方法,有興趣的朋友們可以參考下。
    2020-08-08
  • python實現(xiàn)計算圖形面積

    python實現(xiàn)計算圖形面積

    這篇文章主要為大家詳細介紹了python實現(xiàn)計算圖形面積,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 解決Python中l(wèi)ist里的中文輸出到html模板里的問題

    解決Python中l(wèi)ist里的中文輸出到html模板里的問題

    今天小編就為大家分享一篇解決Python中l(wèi)ist里的中文輸出到html模板里的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Pytorch中torch.argmax()函數(shù)使用及說明

    Pytorch中torch.argmax()函數(shù)使用及說明

    這篇文章主要介紹了Pytorch中torch.argmax()函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 如何使用pycharm連接Databricks的步驟詳解

    如何使用pycharm連接Databricks的步驟詳解

    這篇文章主要介紹了如何使用pycharm連接Databricks,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 我喜歡你 抖音表白程序python版

    我喜歡你 抖音表白程序python版

    我喜歡你!這篇文章主要為大家詳細介紹了抖音表白程序python版的實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼

    django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼

    這篇文章主要介紹了django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-08-08
  • python實現(xiàn)圖像拼接

    python實現(xiàn)圖像拼接

    這篇文章主要為大家詳細介紹了python實現(xiàn)圖像拼接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • python3 反射的四種基本方法解析

    python3 反射的四種基本方法解析

    這篇文章主要介紹了python3 反射的四種基本方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python實現(xiàn)國外賭場熱門游戲Craps(雙骰子)

    Python實現(xiàn)國外賭場熱門游戲Craps(雙骰子)

    這篇文章主要介紹了Python實現(xiàn)國外賭場熱門游戲Craps(雙骰子)的源碼及運行方法,十分簡單,有需要的小伙伴可以參考下。
    2015-03-03

最新評論

获嘉县| 大新县| 龙陵县| 湖南省| 兴城市| 三台县| 绥江县| 临夏县| 龙井市| 平谷区| 万山特区| 汉中市| 南岸区| 永清县| 扎囊县| 南涧| 那曲县| 桐城市| 房山区| 禹城市| 南昌市| 牟定县| 正定县| 永修县| 常州市| 治县。| 凤冈县| 大化| 泸水县| 阿合奇县| 华蓥市| 吴忠市| 台前县| 柘城县| 吐鲁番市| 万载县| 苍梧县| 民和| 灵宝市| 新田县| 海南省|