問題タブ [gevent]
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.
python - ジョブでの gevent 例外の監視
gevent を使用してアプリケーションを作成しています。多くのジョブが生成および破棄されているため、私のアプリはかなり大きくなっています。これらのジョブの 1 つがクラッシュしても、アプリケーション全体が実行され続けることに気付きました (例外がメイン以外のグリーンレットから発生した場合)。これは問題ありません。しかし問題は、エラーを確認するためにコンソールを見なければならないことです。そのため、アプリケーションの一部が「死ぬ」可能性があり、すぐにそれを認識せず、アプリは実行され続けます。
私のアプリをtry catchのもので揺さぶるのは、きれいな解決策ではないようです。たぶん、いくつかのエラー報告を行うカスタム spawn 関数でしょうか?
geventジョブ/グリーンレットを監視する適切な方法は何ですか? 例外をキャッチしますか?
私の場合、いくつかの異なるソースのイベントをリッスンし、それぞれに対処する必要があります。非常に重要な仕事が5つほどあります。Web サーバー グリーンレット、Websocket グリーンレット、データベース グリーンレット、アラーム グリーンレット、および zmq グリーンレット。それらのいずれかが「死ぬ」場合、私のアプリケーションは完全に死ぬはずです。死ぬ他の仕事はそれほど重要ではありません。たとえば、何らかの例外が発生したために websocket greenlet が停止し、残りのアプリケーションが何事もなかったかのように正常に動作し続ける可能性があります。今では完全に役に立たず危険であり、激しくクラッシュするはずです.
python - Geventでマルチプロデューサー、マルチコンシューマーのパラダイムを実装するにはどうすればよいですか?
I / Oヘビーブロッキング呼び出しに依存するプロデューサー関数と、I/Oヘビーブロッキング呼び出しに依存するコンシューマー関数があります。それらを高速化するために、Geventマイクロスレッディングライブラリを接着剤として使用しました。
私のパラダイムは次のようになります。
私には4人の消費者がいて、2人の生産者が欲しいです。プロデューサーは、シグナル、つまり10のときに終了します。コンシューマーはこのキューをフィードし続け、プロデューサーとコンシューマーが終了するとタスク全体が終了します。
ただし、これは機能しません。for
複数のプロデューサーを生成し、単一のプロデューサーのみを使用するループをコメントアウトすると、スクリプトは正常に実行されます。
私は自分が間違ったことを理解できないようです。
何か案は?
ありがとう
python - コルーチンとスレッディングを使用した場合のスループットの違い
数日前、複数のHTTPリクエストを構造化するためのパラダイムの設計を支援することについてSOについて質問しました。
これがシナリオです。マルチプロデューサー、マルチコンシューマーのシステムが欲しいのですが。私のプロデューサーはいくつかのサイトをクロールしてスクレイプし、見つけたリンクをキューに追加します。複数のサイトをクロールするので、複数のプロデューサー/クローラーが必要です。
コンシューマー/ワーカーはこのキューをフィードし、これらのリンクに対してTCP / UDP要求を行い、結果をDjangoDBに保存します。また、各キューアイテムは完全に独立しているため、複数のワーカーが必要です。
人々は、これにコルーチンライブラリ、つまりGeventまたはEventletを使用することを提案しました。コルーチンを使用したことがないので、プログラミングパラダイムはスレッドパラダイムに似ていますが、アクティブに実行されているスレッドは1つだけですが、I / O呼び出しなどのブロック呼び出しが発生すると、スタックはメモリ内で切り替えられ、もう1つはグリーンになります。スレッドは、ある種のブロッキングI/O呼び出しに遭遇するまで引き継ぎます。うまくいけば、私はこれを正しくしましたか?これが私のSO投稿の1つからのコードです:
sleep
呼び出しが呼び出しをブロックしており、sleep
イベントが発生すると、別のグリーンスレッドが引き継ぐため、これはうまく機能します。これは、順次実行よりもはるかに高速です。ご覧のとおり、プログラムには、あるスレッドを別のスレッドに意図的に実行させるコードはありません。すべてのスレッドを同時に実行したいので、これが上記のシナリオにどのように適合するかがわかりません。
すべて正常に動作しますが、Gevent / Eventletsを使用して達成したスループットは、元の順次実行プログラムよりも高くなりますが、実際のスレッドを使用して達成できるスループットよりも大幅に低くなります。
スレッドメカニズムを使用してプログラムを再実装する場合、コルーチンのようにスタックをスワップインおよびスワップアウトする必要なしに、プロデューサーとコンシューマーのそれぞれが同時に作業できます。
これは、スレッドを使用して再実装する必要がありますか?私のデザインは間違っていますか?コルーチンを使用することの本当の利点を理解できませんでした。
たぶん私の概念は少し泥だらけですが、これは私が同化したものです。私のパラダイムと概念の助けや明確化は素晴らしいでしょう。
ありがとう
python - gevent でトレースバックをキャプチャする方法
Greenlet を生成し、callable にリンクしました。しばらくして、Greenlet は例外で失敗します。リンクされた callable が呼び出されます。それはすべて素晴らしいです!
問題は次のとおりです。
ご想像のとおり、例外のトレースバックがコンソールに表示されます。しかし、リンクされた呼び出し可能オブジェクト内でそのトレースバックを処理したいと考えています。リンクされた呼び出し可能オブジェクト内でそのトレースバックにアクセスするにはどうすればよいですか?
(私の最初の本能は を使用するtraceback.extract_stack()
ことでしたが、例外ではなく、リンクされた callable 自体のトレースバックを提供することが判明しました。)
python - Djangoをグリーンにする
何千ものTCP/UDPリクエストを行うDjango管理コマンドがあります。コルーチンとして機能するようにコードを再構築したので、Geventを使用してこれを高速化しました。ソケット接続はブロックされなくなりましたが、私が読んだところによると、Djangoの一部はまだ緑色ではありません。(グリーンとは、グリーンレットを使用することを意味します。)
Djangoのどの部分が緑ではないのか、そしてそれらを緑にするために私ができることを教えてください。まだブロックしているDB関連の部分がいくつかあると思います。Djangoを環境に優しいものにするのに役立つライブラリ/パッチはありますか?
リクエスト/レスポンスのサイクルが緑色であるかどうかについてあまり心配していません。したがって、Gunicornは私を助けてくれますか?
ありがとう
django - Django、Ajaxロングポーリング、Postgresql:アイドルトランザクション
ajaxlongpollingとGeventを使用してチャットを実装しました。読み取るには、クライアントは更新ビューをajaxし、Gevent.event.waitで更新を待ちます。
問題:(セッション情報を取得するために)リクエストの開始時にDjangoによって開かれたPostgresqlトランザクションは、リクエストの終了まで閉じられません。そして、それらのアイドル状態のトランザクションは多くのメモリを消費します。
リクエストを閉じずにPostgresqlトランザクションを閉じる最もクリーンな方法は何でしょうか?現在、request_finishedシグナルを手動で送信していますが、ハックのように感じます。
django - Djangoで使用するのに最適なsocket.ioサーバーは何ですか?geventまたはtornadio2?
クライアント側でbackbone.jsとsocket.ioを使用し、サーバー側でDjangoを使用してWebAppに取り組んでいます。データが変更されたときにサーバーから「プッシュ」したい(チャットアプリの場合と同じように)。私はPythonでsocket.ioの2つの実装に出くわしました。Djangoとの統合は有望に見えました。
- geventとgevent-socketioに基づくdjango- socketio
- tornadio-with-djangoやdjango- tornadioなどのtorandio2を使用するトルネードベースの統合
geventとtornadoはどちらも非常に優れたパフォーマンスを発揮するため、他の非同期接続フレームワークには興味がありません。他の唯一の要件は、接続にSSLを使用することです。プレーンテキストの送信はありません。
では、これら2つのアプローチの間で、どちらを実装するのが最も簡単でしょうか?django-socketioがgeventで行うのと同様に、tornadio2のサブスクリプションベースの優れたフレームワークはありますか?
私が出くわしたもう1つのオプションは、これもTornadIO2に基づくdjango-serverpushです。他のTornadIO2アプリよりもDjangoとの統合が優れていますが、本番環境に対応する前に、実装を改善する必要があります。
python - Python モジュールにパッチを適用するときの Django での Gevent 例外
gevent
ライブラリとgreenlet
ライブラリをインストールし__init__.py
、Djano アプリケーションのファイルに次の 2 行でダンプしました。
現在、Django コンソールに次のようなエラーが頻繁に表示されます。
この 2 行を削除すると、アプリケーションは問題なく動作します。これは、私が Windows マシンで使用しているパッケージのリストです。
Django と Gevent との互換性の問題はありますか? ここで何か間違ったことをしていますか?
参考までに、非公式の Python リポジトリからビルド済みの Windows バイナリを使用しています。これは開発環境です。
python - ガンコーンとウェブソケット
http://www.gelens.org/code/gevent-websocket/を実行しようとしていますが、次のエラーが発生し続けます。
Mint Linuxでpython 2.7.2を実行しています
python - Windowsにgeventをインストールするにはどうすればいいですか?
Windowsにgeventをインストールしようとしています。これを行うために、libeventをダウンロードしてコンパイルした後、実行するpip install gevent
とエラーが発生しますPlease provide path to libevent source with --libevent DIR
。libevent
オプションをsetup.py
使用に渡すにはどうすればよいpip
ですか?
よろしくお願いします、Ivan。
UPD:実行pip install gevent --install-option="--libevent path_to_libevent"
すると同じ結果が得られます。