await and
task.wait in synchronousプログラミング:デッドロックトラップ
非同期プログラミングでは、と
task.wait の違いを理解することが重要です。この記事では、
task.waitall を使用してデッドロックが引き起こされる場合を分析します。
task.wait :同期ブロッキング
]
task.wait
は、タスクが完了するまで現在のスレッドを同期してブロックします。例のコードでは、 task.waitall
は、 ROS()
メソッドによって返される10のタスクすべてが完了します。これにより、スレッドがブロックされ、後続の操作が実行されなくなります。
待ち
:非同期待機
]
await
デッドロックシーン
]
サンプルコードでは、
get メソッドは
task.waitall を呼び出してスレッドをブロックし、
ros メソッドは非同期メソッドを呼び出します
foo bar
はasynchronousの手術を作成します。これにより、タスクがスレッドの完了と解放を効果的に防ぎます。その結果、 get
メソッドが終了することはなく、デッドロックになります。
非同期コードでのブロッキング操作
]非同期コードでのブロッキング操作の使用は、一般的に推奨されません。ブロッキングが発生すると、スレッドは着信要求を処理できず、パフォーマンスの劣化とデッドロックの可能性をもたらします。
結論は
wait
task.wait の違いを理解することは、デッドロックを避け、非同期プログラミングを効果的に活用するために重要です。
task.wait は、同期ブロッキングが必要な特定のシナリオでのみ使用する必要があります。ほとんどの場合、「完全に非同期」アプローチを使用して、コード全体で
を使用して、非同期性を維持し、問題をブロックするのを防ぐことをお勧めします。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3