2015-01-02 12 views
17

TLDR:アプリケーション開発者向けのasyncioの包括的または正式な説明(チュートリアル/ブック/プレゼンテーション/ ...)を探しています。Pythonのasyncioを理解/理解するためのリソース

私は、イベントループと先物/遅延/約束(主にJavaScriptのおかげで)をよく理解していますが、何とかしてPythonのasyncioの複雑さが私を混乱させています。 asyncioは、以前の実装(Twisted、Tornadoなど)との低レベルの互換性のために部分的に設計されていたため、別のスレッドで複数のイベントループが可能になっているため、

基本的な概念の包括的なウォークスルーはありません。そのため、official docsに加えて、articlespresentationsをウェブ上で相談しました。

しかし、アプリケーションレベルで何が関連しているのか、上記の選択肢について心配する必要がないということは必ずしも明確ではないため、私の理解は不明です。 (多くのリソースがツイストらに精通を想定しているように見える。)

私のための不確実性を誘導し、物事のいくつかの例:

  • をこれまでのところ、私は唯一のyield fromと組み合わせてasyncio.coroutineを使用しましたが、this comparisonが示唆します私は再考する必要があります。
  • サーバは、loop.create_server(MyProtocol)またはasyncio.start_server(my_connection_handler)を使用して作成することができます。
  • ループのライフサイクルを管理する上で適切な衛生管理は何ですか(loop.run_forever()の後にloop.close()など)?
  • 私はまだFutureに加えてTaskが必要である理由をまだ理解していません。
  • クラスコンストラクタをノンブロッキングにしたい場合はどうすればいいですか(無効なのはyield fromです)。
  • クラスクラスのgetterを非同期にする(つまり、@propertyasyncio.coroutineを組み合わせる)?
  • 特定の関数が非同期であるかどうかはどのようにして知ることができますか?たとえば、私はStreamWriter.writeがノンブロッキングであると期待していますが、実際にそうであるかどうかはわかりません。

私はこれらの特定の質問に対する回答を求めていませんが、私は概念レベルでどのように苦労しているかを示しています。

+0

です。 しかし、私は多分asyncioに関する特定の質問に答えることができます。 –

+0

ありがとうございます。今、私は概念的なレベルで私の理解に役立つものではないので、私は個々の質問に上記を回すことが意味があるかどうかはわかりません。おそらく私はそれを考えすぎているので、それを考慮する。 – AnC

答えて

2

私は答えを探して、あなたのようですが、私は事withoneあなたを助けることができる:非ブロック問題について

は、私はTwitterのフィードを聞くために、非同期ループを使用するプログラムを作成し、私はここで答えを見つけ

asyncio yield from concurrent.futures.Future of an Executor

を基本的には、executorを使用して、あなたは、任意のタスク非ブロックすることができます。ちょうど警告、私の仕事は独立しており、同期する必要はありません、私はそれらを非ブロックになるために必要としました。あなたがそれらを各toherを待つ必要がある場合は、youhaveはセマフォ

を使用するには、ここで私はそれをやった方法OS:

http://www.drdobbs.com/open-source/the-new-asyncio-in-python-34-servers-pro/240168408:ここ

@asyncio.coroutine 
def boucle_deux(): 
#faire attendre la boucle si pas bcp de mots 
    while True: 
     print("debut du deux") 
     value = t.next() 
     future2 = loop.run_in_executor(None, mention, "LQNyL2xvt9OQMvje7jryaHkN8", 
             "IRJX6S17K44t8oiVGCjrj6XCVKqGSX9ClfpGpfC467rajqePGb", 
             "2693346740-km3Ufby8r9BbYpyzcqwiHhss22h4YkmnPN4LnLM", 
             "53R8GAAncFJ1aHA1yJe1OICfjqUbqwcMR38wSqvbzsQMB", 23, value) 
     response2 = yield from future2 
     yield from asyncio.sleep(5) 
     print("fin du deux") 

asyncio.Task(boucle_deux()) 

は、私は私がよりよく理解して助けたことが判明いくつかのリンクあり

http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html

http://www.drdobbs.com/open-source/the-new-asyncio-module-in-python-34-even/240168401

http://ntoll.org/article/asyncio

確かにそれは本ではないですが、私はあなたを助けることができない書籍やチュートリアルを求めているなら、それは良い出発場所

+0

ありがとうございます。エグゼクティブについてよく知っていると便利でしょう。しかし、「あなたはどのようなタスクもノンブロッキングにすることができます」は、どのパーツが既にブロックされているかを前提としています。 (上記の 'StreamWriter'の例を参照してください。)また、あなたが言及した記事を見つけました。 – AnC

+0

streamWriterの場合、ストリーミングオブジェクトです。ストリーミングオブジェクトは、サーバーと同じように受信するすべてのメッセージに応答するため、ブロックされません。ただ聞いているだけです。私の場合は、ブロックしているものを掘り下げるために、私は簡単なテストを行い、同時に2つのタスクを実行しようとし、それがブロックされていることを理解してから、それを理解しました。私の仕事は長い時間がかかっていたので、私は同じスレッドで2つを実行しようとすると、それは他の1つ、したがってエグゼキュータをブロックしたので、タスクには独自のスレッドがあります。それは私がそれを理解した方法です。しかし、多くのユースケースがありますが、あなたは正しいです、それらは文書化されていません。 – Morgan

+0

Twisted Matrixが異なっていても、それはどのように動作するかを読むのに役立ちました:http://stackoverflow.com/questions/6117587/twisted-making-code-non-blocking。私はまたこれを発見した:https://pypi.python.org/pypi/aioprocessing/0.0.1、これはライブラリを通して問題を解決しようとしている。 – Morgan

関連する問題