2017-10-08 15 views
0

私は3つのPowershellを開き、それらのうちの3つで同じコードを実行したいだけです。そこに書かれたものがあるかどう
彼らはまったく同じロジックを持っていくように、それらのそれぞれがチェックするために互いのファイルにアクセスしようとします
プロセス1がclient1.txtを持って、プロセス2はclient2.txtを持っており、Process3は
をclient3.txtました上で動作するためにどの問題を選択する前に、どのようなプロセス3をチェックする必要がありますするとしてここではいくつかのコードは次のとおりです。私はコードを表現することを試みた何他の 'プロセス'が動作していない場合にのみファイルを読む

import os 
while True: 
f = 'C:\Users\Files' 
i = {} 
i['word'] = 'problem X' #just an example, I'll have a whole list 
if os.path.exists(f): 
    try: 
     os.rename(f, f) 
     print 'Access on file "' + f +'" is available!' 
     file1 = open('C:\Users\Files\client1.txt', 'r+') 
     file2 = open('C:\Users\Files\client2.txt', 'r+') 
     if file1.read() == i['word']: 
      print "A process is already working on this problem, check another" 
     elif file2.read() == i['word']: 
      print "A process is already working on this problem, check another" 
     else: 
      print "Found a new problem to work on" 
      file3 = open('C:\Users\Files\client3.txt', 'r+') 
      file3.write(i['word']) 
      file1.close() 
      file2.close() 
      file3.close() 

    except OSError as e: 
     print 'Access-error on file "' + f + '"! \n' + str(e) 
     time.sleep(5) 
     pass 

は次のとおりです。他の人がいない場合、私は唯一のプロセスが問題を開始したいです彼らはすべて同じロジックを持っているので、同じ問題を解決しようとします(私は解決が必要なものがたくさんあります)ので、プログラムとほぼ同時に到達するかもしれませんwhile Trueと続きます。
問題が終了すると、ファイルの内容が削除され、新しい問題が選択され、それが自分のファイルに書き込まれ、他の人が後でチェックできるようになります。

process1が最初に動作する問題( 'AAA')を見つけた場合、それらはすべて空のtxtファイルを持ち、txt2とtxt3をチェックして、それが( 'AAA ')、それをそれ自身のファイルに書き込んで閉じます。
私はtxt1とtxt3の両方を読み取って、すでに( 'AAA')が働いていることを確認してから、もう一度それをリストに入れ、もう一度チェックして、 BBB ')は大丈夫です。それはそれ自身のファイルに書きます。
終了すると、文字列がtxtから削除され、別の文字列が検索され始めます。

両方のプロセスが同時にファイルをチェックしようとする問題があります。他のプロセスがファイルを使用している場合に、プロセスにtime.sleep()を置く方法がある場合は、もう一度やり直してください。

+0

ない重複しますが、おそらく関連:https://stackoverflow.com/questions/30407352/how-to-prevent-a-race-condition-when-multiple-processes-attempt-to -write-to-and – paisanco

+0

@paisanco私は一般的な考え方を理解しています。私はPythonを初めて使う人ですが、それは本当に面白いです。彼らが言及しているブロックは、私が望むプロセスの種類や、単にスレッド/マルチプロセスや、「リンク」を持つものをブロックすると思いますか? – Tax

答えて

2

理想的には、Pythonのmultiprocessingモジュールを使用して各プロセスを開始します。 1つのプロセスが新しいファイルを監視し、そのファイルをワーカープロセスが読み取るqueueに送ることができます。このソリューションは、新しいファイルを探すプロセスが1つしかないので、ファイルロックの必要性を排除します。

Power Shellを使用してプロセスを開始する必要がある場合は、プロセスを連動させるためにロックを使用する必要があります。真のファイルロックは、クロスプラットフォームの方法では困難です。あなたは、しかし、移動を使用してそれを偽造することができます。たとえば、ファイルを移動しようとすることができます(同じファイルシステム上の場所に移動していると仮定すると、ほとんどのオペレーティングシステムでは移動は不可分です)。移動が失敗した場合、別のプロセスが最初にそれを取得していなければならないことが分かっているか、OSに重大な問題が生じています。その後、移動したファイルに対してすべての処理を実行できます。たとえば、次のように

import path 
import shutil 

filename = "C:\\path\\to\\filename.txt" 
_filename = os.path.join(os.path.basename(filename), ".wip") 
wip_filename = os.path.join(os.path.dirname(filename), _filename) 

try: 
    shutil.move(filename, wip_filename) 
except OSError: 
    # another process moved it first 
    pass 
else: 
    do_work(wip_filename) 
+0

あなたは私のコードを実際に私に説明しましたが、これは私が以前理解できなかったものです。私はそれが助けられないと思う、私は離れてマルチプロセッシングとキューからの恐怖に隠れて停止します。ありがとう – Tax

関連する問題