GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

dabeaz

curio – キュリオ – あなたが警告した小さなコルーチンライブラリ

投稿日:

キュリオ – あなたが警告した小さなコルーチンライブラリ

古典 – 並行I / O

Curioは、サブプロセスの起動や、スレッドやプロセスプールへの農業の作業など、並行I / Oと共通システムプログラミングタスクを実行するためのライブラリです。 Pythonコルーチンと、Python 3.5で導入された明示的な非同期/待機の構文を使用します。 そのプログラミングモデルは、協調マルチタスクと、スレッド、ソケット、ファイル、サブプロセス、ロック、キューなどの既存のプログラミング抽象化に基づいています。 あなたはそれが小さく、速く、そして楽しいことがわかります。

重要な免責事項

Curioは、現時点ではPOSIXシステム(OS X、Linuxなど)でのみ動作する実験的なソフトウェアです。 それは進行中の作業ですが、広範に文書化されており、かなり包括的なテストスイートを備えています。 プログラミングAPIは流動的であり、いつでも変更できることにご注意ください。 curioはpipでインストールできますが、PyPIにアップロードされたバージョンは時々更新されるだけです。 おそらく、githubからクローン化されたバージョンを使用すると、より良い結果が得られます。 また、Python 3.6を使用していることを確認する必要があります。 もちろん、あなたの走行距離は変わるかもしれません。

ニュース

古典のバージョン0.9の “リリース”には、さまざまな改善とクリーンアップがあります。 主な変更には、バッファAPIのサポートの向上と非同期スレッドの改善が含まれます。

クイックインストール

pip install git+https://github.com/dabeaz/curio.git

ソケットとcurioを使って実装されたシンプルなTCPエコーサーバを次に示します:

# echoserv.py

from curio import run, spawn
from curio.socket import *

async def echo_server(address):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    sock.bind(address)
    sock.listen(5)
    print('Server listening at', address)
    async with sock:
        while True:
            client, addr = await sock.accept()
            await spawn(echo_client, client, addr, daemon=True)

async def echo_client(client, addr):
    print('Connection from', addr)
    async with client:
         while True:
             data = await client.recv(100000)
             if not data:
                 break
             await client.sendall(data)
    print('Connection closed')

if __name__ == '__main__':
    run(echo_server, ('',25000))

あなたがスレッドでプログラミングした場合、古典が同様に見えることが分かります。 上記のサーバーは、スレッドがフード内で使用されていなくても、何千もの同時クライアント接続を処理できることがわかります。

もちろん、あなたが少し高いレベルを好みたいのであれば、コードのサーバー部分の設定に関連して、ちょっとしたことを世話することができます:

# echoserv.py

from curio import run, tcp_server

async def echo_client(client, addr):
    print('Connection from', addr)
    while True:
        data = await client.recv(100000)
        if not data:
            break
        await client.sendall(data)
    print('Connection closed')

if __name__ == '__main__':
    run(tcp_server, '', 25000, echo_client)

これは可能なことのほんの少しのサンプルです。 詳しくは、 公式文書をお読みください。 チュートリアルは良い出発点です。 このハウツーでは、さまざまなタスクを実行する方法について説明します。

その他の機能

Curioは、SSL接続、同期プリミティブ(イベント、ロック、再帰ロック、セマフォー、条件変数)、キュー、Unixシグナル、サブプロセス、スレッドやプロセスでのタスクの実行をさらにサポートします。 タスクモデルは、キャンセル、タイムアウト、監視、および信頼性の高いコードの作成に不可欠なその他の機能を完全にサポートしています。

キュリオに関連する話

David Beazley著PyGotham、2017年

その他のリソース

大きな質問:なぜですか?

Pythonには、すでに非同期およびイベント駆動のI / O用のさまざまなライブラリが用意されています。 だから、なぜ別の図書館を作るのですか? その質問には簡単な答えはありませんが、ここでは古典を創造するための動機のいくつかがあります。

  • Python 3はプログラミング言語としてかなり進化しており、このようなライブラリをきれいに書くのに適した多くの新しい言語機能を採用しています。 例えば、ノンブロッキングI / Oのサポートの強化、サブジェネレータへの委譲のサポート(yield from)、Python 3.5での明示的なasyncとawait構文の導入などが挙げられます。 Curioはこれらの機能をフルに活用しており、15年前に書かれた従来のPythonコードとの下位互換性の問題に悩まされているわけではありません。
  • 既存のI / Oライブラリは、主に、イベントループ、コールバック関数、先物、およびコルーチンに対するPythonの適切なサポートに先立つさまざまな抽象概念を基に構築されています。 その結果、Cの拡張、Monkeypatching、またはTCPフロー制御プロトコルの半分の再実装を含む難解な魔法に過度に複雑または依存しています。 Curioは、ソケットとファイルを含む既知のプログラミング手法に頼っている間に、問題に対する別のアプローチをとる基盤実装です。 以前にプロセスまたはスレッドを使用して同期コードを記述していた場合、curioは使い慣れていると感じます。 それは設計によるものです。
  • シンプリシティは、信頼性の高いシステムソフトウェアを作成する上で重要です。 コードが失敗すると、デバッグが可能になります。必要に応じて、オペレーティングシステムへの個々の呼び出しのレベルまで低下する可能性があります。 シンプリシティは大変重要です。 シンプルコードはまた、より速く実行される傾向があります。 Curioの実装は単純であることを目指しています。 Curioを使用するためのAPIは、直感的であることを目指しています。
  • それは楽しいです。

質問と回答

Q:asyncioモジュールを使ってcurioを実装していますか?

A:いいえ、Curioはスタンドアロンのライブラリです。 ライブラリのコアは、 asyncioと同じ基本的な機械をasyncioしてI / Oイベントをポーリングしますが、これらのイベントの処理は全く異なる方法で実行されます。

Q:キュリオはasyncioのクローンであることを意図していますか?

A:いいえ。古典では重複する機能がかなりありますが、APIは大きく異なります。 他の図書館との互換性は目標ではありません。

Q:作成できるタスクはいくつですか?

A:各タスクには、ジェネレータをカプセル化するTaskクラスのインスタンスが含まれています。 スレッドは使用されません。 そのため、実際にはマシンのメモリによって制限されているだけで、何十万ものタスクが発生する可能性があります。 古典的なI / O機能は、組み込みselectorsモジュールを使用して実装されています。 したがって、許可されているオープンソケットの数は、オペレーティングシステムによって課せられたユーザごとの制限と組み合わせたそのライブラリの制限の対象となります。

Q:他のイベントループとの相互運用が可能ですか?

A:「相互運用」という言葉の意味にかかっています。 外部世界とのコミュニケーションのCurioの好ましいメカニズムはキューです。 Curio、スレッド、およびキューを使用する他のイベントループ間で通信することは可能です。 また、別のスレッドで別々に実行しなければならないという条件で、Curioはasyncioイベントループに作業を送信することもできます。

Q:古典はどれくらい早いですか?

A:ここに示した単純なエコーサーバのラフなベンチマークでは、CurioはPython 3.6のasyncioでコルーチンを使用した同等のコードよりも約20%高速です。 これはOS-X上にあるため、あなたの走行距離は異なる場合があります。 Curioは、スレッド、低レベルコールバックベースのイベント処理( asyncio低レベルプロトコルasyncio )、またはアセンブリ言語による直接コーディングを利用するサーバーほど高速ではありません。 しかし、これらのアプローチにはコルーチンも含まれていません(これはCurio全体のポイントです)。 さまざまなテストプログラムのディストリビューションのexamples/benchmarkディレクトリを参照してください。

Q:キュリオはフレームワークに進化しますか?

A:いいえ、フレームワークに進化すると、実際に何かを行うようにキュリオを修正することになるからです。 実際に何かをしたら、人々はそれを使って物事を始めるでしょう。 そして、これらのすべてのことを文書化し、テストし、サポートする必要があります。 人々は、さまざまな提供されたものに関連するすべてのものが、何か狂ったことをするために追加された新しいものをどのように持っているべきかについて不平を言うでしょう。 忘れないで、Curioはできる限り最善を尽くすことを約束しています。 これにはHTTPを実装しないことが含まれます。

Q:将来の計画は何ですか?

A:将来のcurioに関する作業は、主にパフォーマンス、デバッグ、診断、および信頼性に関連する機能に焦点を当てます。 主な目的は、同時実行タスクを実行および制御するための堅牢な環境を提供することです。 しかし、それはまた楽しいものになるはずです。 APIについて考えるとき、それを楽しくするために多くの時間が費やされています。

Q:キュリオのステッカーはありますか?

A:いいえ。

Q:キュリオの大きさはどれくらいですか?

A:現在、完全なライブラリは、カバレッジテストで報告されている約3200件のステートメントから構成されています。

Q:Curioを使用しないという警告が表示されます。 私は何をすべきか?

A:プログラミングは何も教えていませんか? 警告は無視されます。 もちろん、Curioを使うべきです。

Q:私は貢献できますか?

A:もちろんです。 プルリクエスト、バグ、機能リクエストに関する主な議論として、Githubのページ( https://github.com/dabeaz/curio)を使用してください。

ドキュメンテーション

公式の文書はこちらから: https : //curio.readthedocs.io

ディスカッションフォーラム

Curioのディスカッションフォーラムは、 http: //forum.dabeaz.com/c/curioで入手できます。 そこに行って質問をし、プロジェクトの出来事を見つけてください。

貢献者

  • デイビッド・ビーズリー
  • ブレットキャノン
  • ナサニエル・スミス
  • アレクサンダー・ズコフ
  • ローラ・ディキンソン

キュリオはDavid Beazley(@dabeaz)によって作成されました。 http://www.dabeaz.com

これは若いプロジェクトです。 すべての寄付は大歓迎です。







-dabeaz

執筆者: