タグ付けされた質問 「python-asyncio」

3
Asyncio.gatherとasyncio.wait
asyncio.gatherそして、asyncio.wait同様の用途を持っているように見える:私は(必ずしも次の開始前に終了するのを待っていない1)のために/待機を実行したいことを、私は非同期物事の束を持っています。それらは異なる構文を使用しており、一部の詳細は異なりますが、機能が非常に重複している2つの関数を使用することは、私には非常に不便です。何が欠けていますか?

4
asyncioは実際にどのように機能しますか?
この質問は、別の質問「cdefで待機する方法」によって動機付けられています。 Webにはに関する記事やブログ投稿がたくさんありますがasyncio、それらはすべて表面的なものです。asyncio実際にどのように実装されているのか、I / Oが非同期になる原因についての情報は見つかりませんでした。私はソースコードを読み込もうとしていましたが、何千行もの最高級のCコードではありません。その多くは補助オブジェクトを扱っていますが、最も重要なのは、Python構文とそれが変換するCコードとを関連付けるのが難しいことです。に。 Asycnio独自のドキュメントは、あまり役に立ちません。それがどのように機能するかについての情報はそこにはありません、それを使用する方法についてのいくつかのガイドラインだけがあり、これも時々誤解を招く/非常に不十分に書かれています。 私はGoのコルーチンの実装に精通しており、Pythonが同じことを実行することを望んでいました。その場合、上記のリンクで私が思いついたコードはうまくいきました。それができなかったので、私は今、その理由を理解しようとしています。これまでの私の推測は次のとおりです。間違っている箇所を修正してください。 フォームのプロシージャ定義は、async def foo(): ...実際にはクラスを継承するメソッドとして解釈されますcoroutine。 おそらく、async def実際にはawaitステートメントによって複数のメソッドに分割され、これらのメソッドが呼び出されるオブジェクトは、これまでの実行を通じて行われた進行状況を追跡できます。 上記が真の場合、基本的に、コルーチンの実行は、いくつかのグローバルマネージャー(ループ?)によるコルーチンオブジェクトのメソッドの呼び出しに要約されます。 グローバルマネージャーは、I / O操作がPython(のみ?)コードによっていつ実行されるかをどうにか(方法?)認識しており、現在実行中のメソッドが制御を放棄した後に実行する保留中のコルーチンメソッドの1つを選択できます(awaitステートメントのヒット))。 言い換えると、これは、いくつかのasyncio構文をよりわかりやすいものに「脱糖」するための私の試みです。 async def coro(name): print('before', name) await asyncio.sleep() print('after', name) asyncio.gather(coro('first'), coro('second')) # translated from async def coro(name) class Coro(coroutine): def before(self, name): print('before', name) def after(self, name): print('after', name) def __init__(self, name): self.name …

4
「ファイアアンドフォーゲット」python async / await
ときどき、重要でない非同期操作が発生することがありますが、それが完了するのを待ちたくありません。トルネードのコルーチンの実装では、yieldキーワードを省略するだけで非同期関数を「起動して忘れる」ことができます。 私は、Python 3.5でリリースされた新しいasync/ await構文を使用して「起動して忘れる」方法を理解しようと努めてきました。たとえば、簡略化されたコードスニペット: async def async_foo(): print("Do some stuff asynchronously here...") def bar(): async_foo() # fire and forget "async_foo()" bar() 何が起こるかというと、bar()決して実行されず、代わりにランタイム警告が表示されます。 RuntimeWarning: coroutine 'async_foo' was never awaited async_foo() # fire and forget "async_foo()"

4
Python 3でのマルチプロセッシングvsマルチスレッディングvs asyncio
Python 3.4では、マルチプロセッシング/スレッディング用のいくつかの異なるライブラリがあることを発見しました:マルチプロセッシング vs スレッディング vs asyncio。 しかし、どちらを使用するか、または「推奨されるもの」かわかりません。彼らは同じことをしますか、それとも異なりますか?もしそうなら、どれが何のために使用されますか?コンピューターでマルチコアを使用するプログラムを書きたいのですが。しかし、どのライブラリを学ぶべきかわかりません。

4
Python 3.5のコルーチンとフューチャー/タスクの違いは?
ダミー関数があるとしましょう: async def foo(arg): result = await some_remote_call(arg) return result.upper() 違いは何ですか: coros = [] for i in range(5): coros.append(foo(i)) loop = get_event_loop() loop.run_until_complete(wait(coros)) そして: from asyncio import ensure_future futures = [] for i in range(5): futures.append(ensure_future(foo(i))) loop = get_event_loop() loop.run_until_complete(wait(futures)) 注:この例では結果が返されますが、これは質問の焦点では​​ありません。戻り値が重要な場合は、のgather()代わりに使用してくださいwait()。 戻り値に関係なく、私は明快さを探していensure_future()ます。wait(coros)そして、wait(futures)コルーチンを実行し、そのとき、なぜコルーチンはに包まれるべき両方ensure_future? 基本的に、Python 3.5を使用して一連の非ブロッキング操作を実行する正しい方法(tm)はasync何ですか? 追加のクレジットについて、コールをバッチ処理する場合はどうなりますか?たとえば、some_remote_call(...)1000回呼び出す必要がありますが、同時接続数が1000のWebサーバー/データベースなどを壊したくありません。これはスレッドまたはプロセスプールで実行できますが、これを行う方法はありasyncioますか?

4
asyncio.ensure_future対BaseEventLoop.create_task対単純なコルーチン?
さまざまなフレーバーで同じ操作を行うasyncioに関するいくつかの基本的なPython 3.5チュートリアルを見てきました。このコードでは: import asyncio async def doit(i): print("Start %d" % i) await asyncio.sleep(3) print("End %d" % i) return i if __name__ == '__main__': loop = asyncio.get_event_loop() #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)] #futures = [loop.create_task(doit(i)) for i in range(10)] futures = [doit(i) for i in range(10)] result = …

5
__init__でawaitを使用してクラス属性を設定する方法
awaitコンストラクターまたはクラス本体でクラスを定義するにはどうすればよいですか? たとえば、私が欲しいもの: import asyncio # some code class Foo(object): async def __init__(self, settings): self.settings = settings self.pool = await create_pool(dsn) foo = Foo(settings) # it raises: # TypeError: __init__() should return None, not 'coroutine' またはクラス本体属性の例: class Foo(object): self.pool = await create_pool(dsn) # Sure it raises syntax Error def __init__(self, settings): …

2
非同期コンテキストチェックをトリガーせずに、Jupyter Notebookでdjango 3.0 ORMを使用する方法
Django 3.0はasgi / asyncのサポートを追加しており、非同期コンテキストで同期リクエストを行うことを防いでいます。同時に、IPythonは最上位の非同期/待機サポートを追加しました。これは、デフォルトのイベントループ内でインタープリターセッション全体を実行しているようです。 残念ながら、これら2つの優れた追加の組み合わせは、jupyterノートブックでのdjango ORM操作がSynchronousOnlyOperation例外を引き起こすことを意味します。 SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async. 例外メッセージが言うように、各ORM呼び出しを次のsync_to_async()ようにラップすることが可能です: images = await sync_to_async(Image.objects.all)() しかし、特に属性の検索で暗黙的に解決される関連フィールドの場合は特に、あまり便利ではありません。 (私は%autoawait off魔法を試しましたが、それは機能しませんでした、私が想定しているドキュメントを一目見ただけで、それはipykernelが常に非同期ループで実行されるためです) それで、djangoの非同期コンテキストチェックで同期を無効にするか、同期コンテキストでipykernelを実行する方法はありますか? コンテキスト:私はdjangoをバックエンドサーバーとして使用するデータサイエンスパッケージを作成しましたが、ORMの上にjupyterベースのインターフェイスを公開し、データのクリーンアップ/注釈付け、機械学習実験の追跡、トレーニングジョブの実行をすべてjupyterノートブックで実行できるようにしました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.