2

次のようなデーモンを書きたいと思っています。

  • zip ファイルへのパスを含むキュー (sqs、rabbit-mq など) からメッセージを読み取ります
  • 「このジョブは処理中です」などと言って、データベース内のレコードを更新します
  • 前述のアーカイブのコンテンツを読み取り、見つかった各ファイルのファイル メタデータから選別された情報を使用して、データベースに行を挿入します
  • 各ファイルを s3 に複製します
  • zipファイルを削除します
  • ジョブを「完了」とマークする
  • キュー内の次のメッセージを読み取り、繰り返します

これはサービスとして実行され、誰かが Web フロントエンド経由でファイルをアップロードしたときにキューに入れられたメッセージによって開始されます。アップローダはすぐに結果を確認する必要はありませんが、アップロードはバックグラウンドで適切に処理されます。

私はPythonに堪能なので、最初に頭に浮かぶのは、各リクエストを処理して上記のプロセスを実行するためのツイストを備えた単純なサーバーを作成することです。しかし、マルチユーザー コンテキストで実行されるこのようなものを作成したことはありません。1 分または 1 時間に数百のアップロードを処理するわけではありませんが、一度に複数のアップロードを処理できると便利です。また、マルチスレッド アプリケーションを作成したり、ブロッキングなどの問題に対処したりすることにもあまり詳しくありません。

過去に人々はこれをどのように解決しましたか?私が取ることができる他のいくつかのアプローチは何ですか?

助けと議論を前もってありがとう!

4

3 に答える 3

1

マルチスレッド化を避け、代わりにキューとデータベースを使用して、起動したい数のワーカープロセスを同期します。

このアプリケーションの場合、サーバーアプリケーションを作成するためのねじれたフレームワークやフレームワークはやり過ぎになると思います。

単純にする。Pythonスクリプトが起動し、キューをチェックし、いくつかの作業を行い、キューを再度チェックします。適切なバックグラウンドデーモンが必要な場合は、ここで説明されているように、ターミナルからデタッチすることを確認する必要があります。Pythonでデーモンを作成するにはどうすればよいですか。

いくつかのログを追加します。おそらく、失敗を電子メールで送信するためのtry/exceptブロックです。

于 2009-04-17T00:53:54.793 に答える
1

私はBeanstalkdをキューイング デーモンとして使用して、非常に良い効果を上げました (直近の処理と画像のサイズ変更 - 過去数週間でこれまでに 200 万件以上)。zipファイル名(おそらく特定のディレクトリから)でメッセージをキューにスローします[JSONでコマンドとパラメーターをシリアル化します]。ワーカークライアントでメッセージを予約すると、許可しない限り、他の誰もそれを取得できませんタイムアウトします(ピックアップされるキューに戻るとき)。

残りは、他のライブラリがあるS3への解凍とアップロードです。

一度に複数の zip ファイルを処理する場合は、必要な数のワーカー プロセスを実行します。

于 2009-04-16T23:53:28.590 に答える
1

セロリ ( http://ask.github.com/celery/introduction.html )、rabbitmq、および単純な django ビューを組み合わせてアップロードを処理することにしました。ワークフローは次のようになります。

  1. djangoビューは受け入れ、アップロードを保存します
  2. アップロードを処理するためにセロリTaskがディスパッチされます。すべての作業は の中で行われますTask
于 2009-11-25T19:28:50.333 に答える