Asyncoreコールバックはスレッドを起動する…わかりましたか?
-
11-10-2019 - |
質問
私は不慣れです Asyncore, 、そして、ねじれたチュートリアルのいくつかのイントロを除き、非同期プログラミングの知識は非常に限られています。
私はスレッドに最も精通しており、すべてのアプリでそれらを使用しています。 1つの特定のアプリがaを使用します couchdb インターフェイスとしてのデータベース。これには、変更と更新を探してDBを長期にすることが含まれます。 couchdbに使用するモジュールはです couchdbkit. 。 Asyncoreループを使用してこれらの変更を監視し、コールバックに送信します。
だから、私はこのコールバックから、ワーカースレッドを起動する場所です。非同期プログラミングとスレッドプログラミングを混ぜることは少し粗雑なようです。私はcouchdbkitが本当に好きですが、私のプログラムに問題を導入することはありません。
それで、私の質問は、非同期コールバックからスレッドを発射しても安全ですか?
これがいくつかのコードです...
def dispatch(change):
global jobs, db_url # jobs is my queue
db = Database(db_url)
work_order = db.get(change['id']) # change is an id to the document that changed.
# i need to get the actual document (workorder)
worker = Worker(work_order, db) # fire the thread
jobs.append(worker)
worker.start()
return
main()
.
.
.
consumer.wait(cb=dispatch, since=update_seq, timeout=10000) #wait constains the asyncloop.
アップデート:
これをもっと見た後、Couchdbkitの達人に追加の質問があります。データベースを使用して数百のスレッドが潜在的に行われます。コードサンプルでわかるように、スレッドごとにcouchdbkit.databaseオブジェクトをインスタンス化しています。これは無駄だと思います。それでは、単一のデータベースオブジェクトがスレッド間でグローバルに使用されることは問題ありませんか?
解決
サーバーが新しいドキュメントを返すたびに、これは新しいスレッドを作成しませんか?私はあなたがワーカースレッドのプールを作成するのが最善だと思います 前 あなたはサーバー上の何かを呼び出し、これらのスレッドが彼らの仕事をで読んでいるというキューにジョブを追加するだけです dispatch
方法。
しかし、スレッドと非同期プログラミングの混合が危険と見なされるべき理由はありません。