このテーマに関するすべてのドキュメントを読みましたが、Pythonコルーチンの概念全体を十分に理解して、やりたいことを実装することができないようです。
私にはバックグラウンドタスクがあり(ランダムなファイルを生成しますが、それはそれほど重要ではありません)、無限ループでこれを実行します(これはウォッチャーです)。
このバックグラウンドタスクを可能な限り最も効率的な方法で実装したいと思います。マイクロスレッド(別名コルーチン)はそれを実現するための良い方法だと思いましたが、まったく機能させることができません(バックグラウンドタスクが実行されます)。またはプログラムの残りの部分のいずれかですが、同時に両方ではありません!)。
コルーチンを使用して実装されたバックグラウンドタスクの簡単な例を教えてもらえますか?それとも、コルーチンをその目的に使用できると誤解していますか?
Python2.7ネイティブコルーチンを使用しています。
私は、特にDBMSとAdaの並行性に精通しているので、基本的な原則についてはよく知っていますが、私にとって非常に新しいコルーチンとしてのジェネレーターの概念には慣れていません。
/編集:これが私のコードのサンプルですが、これをもう一度強調する必要がありますが、機能していません:
@coroutine
def someroutine():
with open('test.txt', 'a') as f:
f.write('A')
while True:
pass
yield 0
@coroutine
def spawnCoroutine():
result = yield someroutine()
yield result
routine = spawnCoroutine()
print 'I am working in parallel!'
# Save 'A' in the file test.txt, but does not output 'I am working in parallel!'
注:@coroutineは、DavidBeazleyによって提供されたcoroutine.pyのデコレータです。
/最終編集とソリューションの要約
あいまいに見えたので、私の質問は閉じられました。これは、実際のところ、私の質問の目的です。スレッド化とマルチプロセッシングでのコルーチンの使用法を明確にすることです。
幸いなことに、恐ろしい制裁が発生する前に、良い回答が提出されました!
上記の質問への答えを強調するために:いいえ、コルーチンとの並列処理がないため、Pythonのコルーチン(またはブルーレット/グリーンレット)を使用して、独立した、潜在的に無限のCPUバウンドタスクを実行することはできません。
これが私を最も混乱させたものです。確かに、並列処理は並行性のサブセットであるため、Pythonでのコルーチンの現在の実装では並行タスクは許可されますが、並列タスクは許可されないことはかなり混乱します。この動作は、Adaなどの並行プログラミング言語のタスクの概念と明確に区別する必要があります。
また、Pythonのスレッドは、I / Oの待機時にコンテキストを切り替えるという点でコルーチンに似ているため、独立したCPUバウンドタスクの候補としては適していません(David BeazleyのGILの理解を参照)。
私が現在使用している解決策は、multiprocessing
モジュールでサブプロセスを生成することです。バックグラウンドプロセスの生成は重いですが、何も実行しないよりはましです。これには、計算の分散を可能にするという利点もあります。
別の方法として、Google App Engineには、マルチプロセッシングの興味深い代替手段を提供できるdeferredモジュールとbackground_threadモジュールがあります(たとえば、 typhoonaeなどのGoogle App Engine APIを実装するライブラリの一部を使用することにより、わかりませんが彼らはまだこれらのモジュールを実装しています)。