Python 3.5 で await を使用する場合と制限事項
Python 3.5 の非同期は、主に asyncio ライブラリと async/ によって促進されます。 await 構文。これらの構造をいつ、どこで利用するかを理解することは、非同期アプリケーションのパフォーマンスを最適化するために重要です。
await を使用するかどうかは、コードの性質によって決まります。デフォルトでは、コードは同期的に実行されます。非同期を導入するには、async def を使用して関数を定義し、await で呼び出します。ただし、同期コードと非同期コードのどちらが当面のタスクに適しているかを判断することが重要です。
一般的な経験則として、I/O 操作を処理する場合は await を使用することが有益です。ネットワーク リクエストやデータベース呼び出しなどの I/O 操作は本質的に非同期であることが多く、イベント ループに委任することで大幅に高速化できます。
たとえば、次の同期コードを考えてみましょう:
download(url1) # takes 5 seconds download(url2) # takes 5 seconds # Total time: 10 seconds
asyncio と await を使用すると、同じコードを非同期で書き直すことができ、合計実行時間を長い時間に比べて短縮できます。 Operation:
await asyncio.gather( async_download(url1), # takes 5 seconds async_download(url2), # takes 5 seconds ) # Total time: only 5 seconds (plus minimal asyncio overhead)
また、非同期関数は必要に応じて同期コードを自由に利用できることに注意することも重要です。ただし、正当な理由なく同期コードを非同期にキャストすることは、本質的に何のメリットももたらさないため避けるべきです。
非同期コードに関する重要な考慮事項の 1 つは、長時間実行される同期操作によってプログラム全体がフリーズする可能性があることです。 。特定のしきい値 (50 ミリ秒など) を超える同期操作は、同時非同期タスクをブロックする可能性があります。
この問題を軽減するには、そのような操作を別のプロセスにアウトソーシングし、その結果を待つことができます。
executor = ProcessPoolExecutor(2) async def extract_links(url): ... # If search_in_very_big_file() is a long synchronous operation, offload it to a separate process links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
最後に、I/O バウンドの同期関数を統合できることは注目に値します。 run_in_executor() と ThreadPoolExecutor を使用して、マルチプロセッシングに関連するオーバーヘッドを最小限に抑える非同期コード。
以上がPython 3.5 非同期プログラミングで「await」をいつ使用する必要がありますか?また、その制限は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。