ネットワークにバインドされた呼び出し (Web サイトのフェッチなど) を行う必要があり、UI をブロックしたくありません。pyobjc で作業している場合、NSThread または python のスレッド化モジュールを使用する必要がありますか? どちらかを選択する方法に関する情報が見つかりません。私のタスクはまったく CPU バウンドではないので、Python の GIL はあまり気にしません。
4 に答える
違いはありません。わずかに異なるインターフェイスで同じ動作が得られます。システムに最も適したものを使用してください。
主に、特に複数のCPUコアがある場合、GIL(Global Interpreter Lock)のためにPythonスレッドがひどいため、別の提案があります。これを非常に詳細に説明しているビデオ プレゼンテーションがありますが、現在そのビデオを見つけることができません。これは Google の従業員によって作成されたものです。
とにかく、スレッドの代わりに subprocess モジュールを使用することを検討することをお勧めします (実行できるヘルパー プログラムを用意するか、システムで別のバイナリを使用します。または、NSThread を使用すると、CPython で得られるパフォーマンスよりも優れたパフォーマンスが得られるはずです)。スレッド。
実行ループを愛することを学びましょう。Cocoa の URL ロード システム(または、プレーン ソケットが必要な場合はNSFileHandle ) を使用して、応答 (または失敗) が戻ってきたときに呼び出されるようにします。そうすれば、スレッドを扱う必要はまったくありません (URL 読み込みシステムがスレッドを使用します)。
Cocoa で独自のスレッドを作成するのは、分割できない大きなタスク (>0.1 秒) があるときだけです。
(誰かが NSOperation と言うかもしれませんが、NSOperationQueue は壊れており、RAOperationQueueは同時操作をサポートしていません。既に多数の NSOperationQueue コードがある場合、または NSOperationQueue を動作させる準備を本当にしたい場合は問題ありませんが、今すぐ同時実行が必要な場合は、ループまたはスレッドを実行してください。 )
スレッドに参加して参照できるので、ネイティブの python スレッド化ソリューションの方が好きです。私の知る限り、NSThread
s はスレッドの参加とキャンセルをサポートしていないため、Python スレッドを使用してさまざまなことを行うことができます。
また、NSThread
s が複数の引数を持つことができないのは残念です。これには ( NSDictionary
s とNSArray
s を使用するなどの) 回避策がありますが、引数を順番に並べてスレッドを呼び出す/対応するパラメーターを使用してスレッドを呼び出すほどエレガントでも単純でもありません。 .
しかし、状況によってNSThread
s を使用する必要がある場合は、まったく問題はないはずです。それ以外の場合は、ネイティブの Python スレッドに固執するのがクールです。