問題タブ [greenlets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
124 参照

mysql - 外部接続を使用した Django スレッドセーフ get_or_create

このデータベース トランザクションを外部 API 呼び出し (S3 バケットの存在を確認する) と組み合わせる必要があることを除いて、この回答に沿った代替get_or_createメソッドがあるとします。データベース レベル (MySQL InnoDB) で一意の制約があるとします。イベントレットを使用して、複数の Gunicorn ワーカー プロセス内でこのコードを実行しています。

トランザクションの成功は、func_to_call(例外を発生させずに) 正常に戻ることが条件です。例外が発生した場合、明らかにトランザクションはロールバックします。

私が確信していないのは、2 つのスレッドが同時にこの関数を使用している場合create、データベースにエントリを保存するか (それIntegrityErrorが発生し、呼び出しがオブジェクトを返す)、終了getするまで「待機」する必要があるかどうかです。func_to_call?

基本的に、上記の関数を次のように呼び出して、このシナリオを想像しています。

  1. スレッド 1 と 2 の両方get_or_create_with_funcがほぼ同時に呼び出されます。
  2. 両方とも、経由でエントリを作成しようとしますobj.objects.create
  3. スレッド 1 がそれ​​を正常に作成したとしましょう。次に、try/except ブロックを終了してから を実行しfunc_to_callます。
  4. スレッド 2 もオブジェクトの作成を試みます。
  5. 理想的には、スレッド 2 はIntegrityError.
  6. スレッド 1 は の呼び出しfunc_to_callを終了しますが、例外は発生しません。
  7. スレッド 2 は「コミット」する (スレッド 1 も既にコミットを終了している) ため、 を呼び出してget、スレッド 1 によって書き込まれた DB オブジェクトを期待どおりに取得できます。

また

  1. スレッド 1 が呼び出さfunc_to_call れ、例外が発生します。
  2. スレッド 1 により、django はトランザクションをロールバックするため、DB エントリは存在しません。
  3. IntegrityErrorスレッド2 は引き続きget.

私の質問は、ステップ 4 でcreate、テーブルの一意の制約が原因で失敗するか、それともスレッド 1 が実際にはまだトランザクションをコミットしていないため (func_to_callかなり遅いとしましょう)、成功するでしょうか?

0 投票する
3 に答える
568 参照

python - マルチプロセッシング キュー/辞書/などをグリーン スレッドに渡す

マルチプロセッシング オブジェクト (キュー、辞書など) を複数の gevent スレッドに渡しても安全ですか? 実際には同時に実行されているわけではないので、問題はないと思います。ただし、gevent が特にマルチプロセッシングと互換性があるとは想定されていないことはわかっています。

0 投票する
2 に答える
1648 参照

python - Gevent: 各 for ループの反復で譲歩するのは良い習慣ですか?

私は、https://github.com/caolan/asyncなどのライブラリを使用して、イベント ループをブロックすることなく、配列を非同期に反復できる Node.js から来ています。

Gevent で同じことを達成するには、sleep(0)ループの反復ごとに呼び出すことで正しいでしょうか?

dbクエリを解析している間、またはPythonコード(IO操作ではない)のブロック時間はごくわずかですが、これはWebサーバーに実際に必要ですか?

0 投票する
1 に答える
416 参照

gunicorn - gevent socketio の使用中に接続が多すぎます

gevent socketio を使用すると、接続が多すぎます (1040)。現在モンキーパッチを使用しています。作成するスレッド (greenlet) の数を制限して、一部のジョブでスレッドを共有することはできますか? 私はガンコーンとジャンゴを使用しています。