- PR -

複数のプロセスからのファイル処理

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-09-03 23:00
何度も出てますが方向的にはMutexやEventなんかでプロセス間で同期取るのがまあ一般的でしょう。
どのようにうまくいかなかったんですかね?
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-09-04 00:32
引用:

enoさんの書き込み (2008-09-03 19:45) より:
読み込みプロセスが読み込んでいる最中に、次の書き込みタイミングが発生したら、どうしますか?>>

どうもしないです。


この確認は、enoさんではなく、がらすさんに向けられたものだと思います。

元の質問に対してどのような方向で考えていくかを見定めるために、現時点での前提が妥当なのかどうかを知るための確認だったと推測します。

私も、その書き込みと読み込みのぶつかり具合が気になります。
書き込み側が一定時間以内に書けないとデータを取りこぼすとかシビアな環境だと手の打ちようがありませんが。。。
holic
ベテラン
会議室デビュー日: 2004/08/24
投稿数: 74
投稿日時: 2008-09-04 00:38
MSMQ 使えばいいのに。
eno
常連さん
会議室デビュー日: 2008/08/22
投稿数: 28
お住まい・勤務地: 代々木上原
投稿日時: 2008-09-04 01:10
元の質問に対してどのような方向で考えていくかを見定めるために、現時点での前提が妥当なのかどうかを知るための確認だったと推測します。
>>

失礼しましたw

MSMQはあくまでネットワーク経由で途中のマシンを挟んで、送信側とは送信側と受信側とは受信側(特にこちら)と同期を代替しているだけで、既に実行されて何らかの状態に遷移しているプロセスに対して、外部のプロセス(同じローカル内)から同時かつ都合よくアクセスしたいというスレの趣旨からは逸脱している気がします。。
オフラインを想定したり、レガシーシステムとの同期目的が強いところからして実用のほどはどうなのか疑問符です。

何度も出てますが方向的にはMutexやEventなんかでプロセス間で同期取るのがまあ一般的でしょう。 >>

実際に.netFWでクラスが準備されているのですから、.net言語はそのクラスを使うのが低コストだと思いますね。禿同w
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2008-09-04 07:01
回答どうもありがとうございました。
結局、Semaphoreの最初の設定のところでミスをしていて、排他がだだ漏れ状態でした。それを直したらきちんと動作しました。お騒がせしてすみません。

Mutexでも出来るとは思いますが、Semaphoreを最初に見つけたという理由でSemaphoreを使っています。未だに2つの違いがよく分かってないのですが、私のやっているような単純な排他処理ならばどちらもOKかなと思っています。

読んでる最中の書き込み、書いてる最中の読み込み、読んでる最中の読み込み、書いてる最中の書き込み、全てブロックしていますが、この動作で問題ないです。読んでる最中の読み込みだけは許してもいい気がしますが、メリットも大きくないので(書き込み・読み込み時間は短いので)このままで行きます。

排他処理をしなければ書き込み・読み込みの衝突は当然起こるので、「試しにアクセスしてみて例外が出ればリトライ」という方法は良くないと思います。例外はあくまで「例外」で、通常処理で例外が起こるようなロジックを組むのは出来る限り避けるべきです。コストもかかるし。たとえば、「Fileをオープンしようとして、File Not Found の例外が起こったら、ファイル存在しないのでその場合の処理をする」というアプローチはいいと思いますか?普通はFile.Existsを使うでしょう。ファイルの存在を確認するExistsのような、他のプロセスにロックされているかを例外無しに調べる方法はないのかを知りたかったのです。少々横道でしたが。

普通に2つのプロセス間通信が目的ならばWCFを使うのが良いと思うのですが、今回は色々なプロセスが色々なファイルを書き換えるケースが想定されるので、複数のファイルを監視できるFileSystemWatcherを使ってやり取りすることにしました。

MSMQやNamed pipeをローカルで使うことも可能だとは思いますが、2つのプロセス同士のみのやり取りに限定されるのでしょうか?

くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-09-04 11:03
MSMQもNamed Pipeも複数プロセス間でやり取りが可能です。

プロセス間通信が目的ならば、これらを使う方が良いと思います。
(ファイル生成が目的ならば、MutexやSemaphoreですね)

MutexとSemaphoreの違いは
Mutex:アクセス出来るスレッドは1つに限定される。
Semaphore:アクセス出来るスレッドは一定数以下に限定出来る。
ってことですかね。

また、Mutexはグローバルミューテックスも使用出来ます。(Windows2000以上に限る)
これは、WindowsXPなどに実装されている複数ユーザーの
同時実行(同時ログオン)されている環境でも排他制御することが可能となります。

Semaphoreは使った事が無いのでグローバルミューテックスと
同等の事が出来るのかは知りません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-04 23:17
引用:

がらすさんの書き込み (2008-09-04 07:01) より:
読んでる最中の書き込み、書いてる最中の読み込み、読んでる最中の読み込み、書いてる最中の書き込み、全てブロックしています


ああ、ここ↓を読み誤っていたようです。申し訳ない。
引用:

FileShareで例外を出さないようには出来るのですが、今度はファイルを読み込んだ後のデータが壊れているという事態が発生します。Write途中にReadしたりすれば、まあ当然なのですが…。




引用:

排他処理をしなければ書き込み・読み込みの衝突は当然起こるので、「試しにアクセスしてみて例外が出ればリトライ」という方法は良くないと思います。例外はあくまで「例外」で、通常処理で例外が起こるようなロジックを組むのは出来る限り避けるべきです。コストもかかるし。たとえば、「Fileをオープンしようとして、File Not Found の例外が起こったら、ファイル存在しないのでその場合の処理をする」というアプローチはいいと思いますか?普通はFile.Existsを使うでしょう。ファイルの存在を確認するExistsのような、他のプロセスにロックされているかを例外無しに調べる方法はないのかを知りたかったのです。少々横道でしたが。


 たいていの場合、それは正しいアプローチです。しかし、File.Exists で True が返ってきた後、Open をする前に誰かが消したら、どうしますか?という問題もあります。
 確かに例外はコストの高い処理ですので、避けるべきです。しかし、場合によっては例外を業務例外に「読み替える」こともします。逆もしかり。
 その意味では、(抽象的な意味で)メッセージを使い、「読んでもよくなったことを知らせる」様にするのがいいのかな、と。

スキルアップ/キャリアアップ(JOB@IT)