0

Cコードエディターを提供するdjangoWebアプリがあります。テキストは、別のサーバーでホストされている別のdjangoアプリケーションに送信され、.cファイルにコードを書き込んでコンパイルして応答を返します。

問題は、ファイルの書き込みとコンパイルにより、アプリケーションが複数のユーザーで使用されている場合に競合状態の問題が発生することです。

これは私がデータを送信する方法です:

def comp(request):   
encoded_data = urllib.urlencode(request.POST)    
url = urllib2.urlopen('http://serverIpadress/compile/?' + encoded_data)    
tml = url.read()
return HttpResponse(tml)

これは、2番目のdjangoアプリでデータが処理される方法です

def compile(request):
data2=urllib.urlencode({'': request.GET.get('content','')})
request.encoding ='koi8-r'
data=request.GET.get('content','')
handle=open('/home/user/file.c','r+')
handle.write(request.GET['content'])
handle.close()
res = commands.getstatusoutput('gcc -Wall /home/user/file.c -o /home/user/file;home/user/file')
return HttpResponse(res)

私はセマフォを使用することを試みました

sem = threading.BoundedSemaphore()
sem.aquire()
writing to file
compiling
sem.release()

しかし、問題は解決しません

私は解決策を探しましたが、私が見つけたのはトランザクションを使用するデータベースに関するものだけです

助けてくれてありがとう

4

2 に答える 2

1

/home/user/file.cリクエストごとに単一のファイルを使用しているようです。そのため、競合状態が差し迫っています。

2 つの解決策があります。

1) 一時ファイルに書き込みます。一時ファイルは tempfile モジュールから生成することも、ランダムなファイル名を作成することもできます。

2) メモリファイルに書き込みます。StringIO(またはより高速な)モジュールを使用cStringIOしてそのようなファイルを作成し、それをgccにパイプできます。

解決策1)の場合、これを行うには多くの方法がありますが、これが私の解決策です:

この部分を変更

data=request.GET.get('content','')
handle=open('/home/user/file.c','r+')
handle.write(request.GET['content'])
handle.close()

# you need 'random', 'string', 'os' modules imported
data=request.GET.get('content','')
filename = "".join(random.sample(string.letters, 10)) + ".c" #sample 10 letters from A-z
filepath = os.path.join('home','user','filename')
handle=open(filepath,'r+')
handle.write(request.GET['content'])
handle.close()
res = commands.getstatusoutput('gcc -Wall %s -o /home/user/file;home/user/file' %filepath)
os.remove(filepath) #remove temporary file after compiling

また、commandsモジュールは非推奨です。を使用する必要がありますsubprocess.call

于 2013-02-13T14:59:45.867 に答える
0

リクエストごとにランダムなファイルを生成し、それを使用する必要があります。tempfileモジュールはそれを助けることができます。

また、生成されたバイナリを気にしない場合は、使用すること-o /dev/nullをお勧めします。

于 2013-02-13T14:52:17.717 に答える