2

静的ファイルを提供し、XMLRPC 要求に応答する内部のチェリーピー サーバーがあります。すべて正常に動作しますが、1 日に 1 ~ 2 回、この静的ファイルとデータベースを更新する必要があります。もちろん、サーバーを停止し、更新を実行してサーバーを起動するだけです。しかし、XMLRPC 経由でサーバーと通信する他のすべてのコードは切断され、ユーザーはブラウザーで「接続できません」と表示されるため、これはあまりきれいではありません。そして、これにより複雑さが増します-外部の開始/停止/更新コードが必要です。すべての更新はcherrypyサーバー自体で完全に実行できます。

どういうわけかプログラムでcherrypyを「一時停止」して、サーバーの静的な「ビジー」ページになり、誰かがサーバーからファイルAをダウンロードしていて、次に必要なファイルBを更新することを恐れずにデータを更新できるので、彼は異なるファイル バージョン。

これをプログラムで実装しようとしましたが、ここで問題はどこにありますか。Cherrypy はマルチスレッド (そしてこれは良いことです) であるため、グローバルな「ビジー」フラグを導入したとしても、データを更新する前に、すべてのスレッドがすでに既存のタスクを完了するのを待つ何らかの方法が必要です。そのような方法を見つけることができません:(。

4

1 に答える 1

2

CherryPy のエンジンは、そのようなことを制御します。を呼び出すengine.stop()と、HTTP サーバーはシャットダウンしますが、最初に既存の要求が完了するのを待ちます。このモードは、リクエストを処理していない間にデバッグを実行できるように設計されています。このステート マシン図を参照してください。は、実際にすべてを停止してプロセスを終了する とstop同じではないことに注意してください。exit

を呼び出しstopてから、別のアプリで HTTP サーバーを手動で再起動して「ビジー」ページを提供し、編集を行い、暫定サーバーを停止してからengine.start()engine.block()もう一度呼び出して、途中で終了することができます。これは、現在のリクエストが終了し、新しい HTTP サーバーがソケットのリッスンを引き継ぐため、ある程度のダウンタイムを意味しますが、変更を開始する前に現在のすべてのリクエストが完了していることを保証します。

別の方法として、通常はリクエストを変更せずに渡すが、トリップすると「ビジー」ページを返す WSGI ミドルウェアを少し書くこともできます。現在のリクエストは引き続き完了することができるため、編集が進行中のリクエストに影響するかどうかわからない期間が生じる可能性があります。WSGI ミドルウェアの書き方は、SO 応答にはあまり適していません。このようなリソースを検索してください。CherryPy に接続する準備ができたら、http://docs.cherrypy.org/dev/concepts/config.html#wsgi を参照してください

于 2012-12-18T16:30:31.153 に答える