ホームページ  >  記事  >  バックエンド開発  >  asyncio を使用して Python でファイルの読み取りと書き込みをカプセル化する詳細な説明と例

asyncio を使用して Python でファイルの読み取りと書き込みをカプセル化する詳細な説明と例

高洛峰
高洛峰オリジナル
2017-03-28 15:24:312529ブラウズ

この記事では主に、asyncio.Future objectを使用してファイルの非同期読み取りと書き込みをカプセル化する方法について説明します。困っている友達は参考にしてください

">

はじめに

ネットワーク IO と同様、ファイルの読み取りと書き込みも時間のかかる操作です。

デフォルトでは、Python はシステムの読み取りと書き込みのブロックを使用します。

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

が呼び出された場合、 イベント ループ がブロックされることを意味します

この記事では、asyncio.Future オブジェクトを使用してファイルの非同期読み取りと書き込みをカプセル化する方法について簡単に説明します。コードは現在 GitHub にのみあります。

Linux

をサポートします。ブロッキングとノンブロッキング

まず、ノンブロッキングの場合、read の各呼び出しがすぐに返されるように変更する必要があります。戻り値が空であることは、ファイル操作がまだ完了していないことを意味します。それ以外の場合は、読み取りファイルの内容です。

ブロックと非ブロックの切り替えはオペレーティング システムに関連するため、この記事では、 Linux バージョン。Unix システム プログラミングの経験がある場合は、Python の操作が似ています。

Rreee

Future オブジェクトは、

JavaScript

で値が計算されるプレースホルダーです。 future を使用できます。

result = await future を使用すると、future が値を取得した後に戻ります。これは、await

演算子

を使用することも意味します。

loop.call_soon

この時点で、私たちのアイデアは、loop.call_soon メソッドを通じてイベントループに挿入できます。ファイルの読み書きが完了していない場合、残りの読み書きバイト数を計算し、読み書きが完了するまで再度イベントループを挿入する機能が登場しました。

従来の Unix プログラミングでは、読み取りと書き込みの while ループが asyncio イベント ループ

に置き換えられることがわかります。以下は、このプロセスの回路図コードです

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

以上がasyncio を使用して Python でファイルの読み取りと書き込みをカプセル化する詳細な説明と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。