欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中使用asyncio 封裝文件讀寫

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

前言

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

默認(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)驗(yàn),會發(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 對象。它是一個占位符,其值會在將來被計(jì)算出來。我們可以使用

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ù)。若一次文件讀寫沒有完成,則計(jì)算剩余所學(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實(shí)現(xiàn)方式

    一維信號小波去噪原理解析及python實(shí)現(xiàn)方式

    這篇文章主要介紹了一維信號小波去噪原理解析及python實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python處理文本文件實(shí)現(xiàn)生成指定格式文件的方法

    python處理文本文件實(shí)現(xiàn)生成指定格式文件的方法

    這篇文章主要介紹了python處理文本文件實(shí)現(xiàn)生成指定格式文件的方法,有一定的實(shí)用價值,需要的朋友可以參考下
    2014-07-07
  • python去除字符串中的空格、特殊字符和指定字符的三種方法

    python去除字符串中的空格、特殊字符和指定字符的三種方法

    本文主要介紹了python去除字符串中的空格、特殊字符和指定字符的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python利用魔法方法玩轉(zhuǎn)對象

    Python利用魔法方法玩轉(zhuǎn)對象

    Python中魔法方法(magic method)其實(shí)就是那些被雙下劃線包圍的方法,這些魔法方法為類添加了**“魔力”,讓我們可以在面向?qū)ο缶幊讨杏酶雍啙嵉拇a來操作對象,下面我們就來具體了解一下如何利用魔法方法玩轉(zhuǎn)對象吧
    2023-12-12
  • Python實(shí)現(xiàn)異常值自動檢測的案例分享

    Python實(shí)現(xiàn)異常值自動檢測的案例分享

    在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中,異常值的檢測是一個關(guān)鍵步驟,它有助于識別數(shù)據(jù)中的異常模式和離群點(diǎn),本文將介紹Python中異常值檢測的實(shí)戰(zhàn)案例,使用一些常見的技術(shù)和庫,為大家提供全面的示例代碼和詳細(xì)解釋
    2024-01-01
  • Python數(shù)據(jù)分析之Matplotlib的常用操作總結(jié)

    Python數(shù)據(jù)分析之Matplotlib的常用操作總結(jié)

    Matplotlib是Python的繪圖庫,它可與NumPy一起使用,提供了一種有效的MatLab開源替代方案,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)分析之Matplotlib常用操作的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Python中的二叉樹查找算法模塊使用指南

    Python中的二叉樹查找算法模塊使用指南

    二叉樹查找算法,在開發(fā)實(shí)踐中,會經(jīng)常用到。按照慣例,對于這么一個常用的東西,Python一定會提供輪子的。是的,python就是這樣,一定會讓開發(fā)者省心,降低開發(fā)者的工作壓力。
    2014-07-07
  • 通過PYTHON來實(shí)現(xiàn)圖像分割詳解

    通過PYTHON來實(shí)現(xiàn)圖像分割詳解

    這篇文章主要介紹了通過PYTHON來實(shí)現(xiàn)圖像分割詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • Python?ttkbootstrap?制作賬戶注冊信息界面的案例代碼

    Python?ttkbootstrap?制作賬戶注冊信息界面的案例代碼

    ttkbootstrap 是一個基于 tkinter 的界面美化庫,使用這個工具可以開發(fā)出類似前端 bootstrap 風(fēng)格的 tkinter 桌面程序。本文重點(diǎn)給大家介紹Python?ttkbootstrap?制作賬戶注冊信息界面的案例代碼,感興趣的朋友一起看看吧
    2022-02-02
  • Python中的Broadcast機(jī)制

    Python中的Broadcast機(jī)制

    這篇文章主要介紹了Python中的Broadcast機(jī)制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論