2017-08-14 10 views
0

私は現在、pythonフラスコを使ってデータ処理Webサーバ(linux)を開発中です。Pythonフラスコ同時に複数のファイルへのアクセスを避ける方法(ファイルの相互排除)

一般的な作業の流れは次のとおり

  1. は、ユーザからの入力ファイルを取得
  2. フラスコ
  3. Javaプログラム処理この入力ファイルをJavaプログラムにこの入力ファイルを渡す(Pythonのフラスコで扱います)出力(複数のファイル)をサーバーに保存します。
  4. Flaskは別のpythonスクリプトを呼び出します。このスクリプトはこれらの出力を処理して最終結果を取得し、その結果をクライアントに返します。

問題は次のとおりです。ステップ3とステップ4の間に中間ファイルがいくつか存在しますが、これはローカルプログラムの場合はまったく問題にはなりません。サーバープログラムとして、複数のクライアントがこのプログラムにアクセスすると、同時にWebプログラムを使用している別のユーザーが入力した予期しない結果が得られます。

これは私が見ているところでは、これはファイルへのアクセスでの相互排除の問題のようなものです。以前はスレッド間の相互排他問題に問題がありましたが、Javaでの同期やピュータンでのロックなどのスレッドロックを使用してそれらのいくつかを解決しましたが、スレッドの代わりにファイルをどうするかはわかりません。

多分私は、異なるクライアントに基づいてファイルの異なるコピーを生成することができました。しかし、私が理解しているように、HTTPはステートレスなので、誰がサーバにアクセスしているのかは分かりません。私はこの目的を達成するためにログインシステムとユーザデータベースを追加したくないので、私はこの問題を解決するためのもっと簡単で良い方法があると感じています。

私は最近、良い解決策を探していましたが、理想的なものを見つけることができませんでしたので、ここでいくつかのアドバイスを探しています。どんな提案も高く評価されます。実行可能なソリューションを提案できる場合は、私にあなたの名前を教えてください。公開されると、このツールに関するデジタルおよびペーパーの出版物の感謝リストにあなたを追加できます。

私はあなたにこの

https://docs.python.org/3/library/fcntl.html#fcntl.lockf

これは、この問題を解決するために非常に多くの方法がある私はそれを解決する方法をであり、それは当然の議論それまでですのようなものを示唆している人のシステムの種類として

+1

解決策の1つは、一時ファイルのランダムな名前(UUIDと考える)を生成し、実行中のプログラム間でそれらの名前を渡すことです。あるいは無作為に指定されたディレクトリです。もう1つは、ファイルの終了後にファイルを削除し、チェックがある場合です。ファイルが存在する場合は、ファイルが存在するかどうかを確認します。 – Kendas

+0

このアイデアをありがとう、私は実際にこの方法を実装することを決めたので、同時に複数のユーザーがプログラムにアクセスすることができます – Coco

答えて

0

最善の解決策でハードに来ている

は競合がそう

あなたがファイルをロックし、あなたがするまでポーリングを続けるが起こる場所出力ファイルがあると仮定しますそのリソースは解放されます(ユーザーは待たなければなりません)。これにより、1人のユーザが(ここではtime.sleepをポーリングして)一度にファイルにアクセスするように強制します。リソースが解放されると、次のユーザープロセスは正常に通過します。

もう1つの簡単な方法は、mysqlやpostgresのようなrdsにデータをダンプすることです。これは並列リクエストから発生したすべてのファイルアクセスの悪夢を処理します(出力ファイルをdbに入れます)。

+0

こんにちはハミュエル、あなたの種類の答えをありがとう。実際には、ファイルをロックすることは、私が本当に良い方法を見つけることができなければ、バックアップソリューションとなりました。私が苦労している理由は、入力ファイルが大きければこのファイル処理に時間がかかることがあるからです。 – Coco

+0

データベースについては、これらのファイルを必要なときにどのように取得できますか?私が説明したように、HTTPプロトコルはステートレスなので、どのデータがどのユーザに属しているのかわかりません。 – Coco

+0

ステートレスは、要求のコンテキスト内で一意のトークンまたはUUIDを持つことができないことを意味しません。プログラムが実行されている間、そのプログラムを追跡して破棄します。 – Kendas

関連する問題