2017-11-19 17 views
0

Javaを使用して分散アルゴリズムBirman-Schiper-Stephensonを実装しました。私はこのプログラムを実行するたびに、3つの端末を開き、コマンドをjava Server 2java Client 0 2java Client 1 2というように3つの端末に分けて入力する必要があります。Pythonでシェルコマンドを使用してマルチスレッドJava RMIを実装する方法は?

私はこのプロセスを自動的にしたい、私は自動的にこれらのJavaファイルを実行するスクリプトを書くためにpythonを使用しようとします。私は以下のコードを試しました:

import os 
import thread 

thread.start_new_thread(os.system('java Server 2')) 
try: 
    thread.start_new_thread(os.system('java Client 0 2')) 
    thread.start_new_thread(os.system('java Client 1 2')) 
except: 
    print "Error: unable to start thread" 

しかし、マルチスレッドプロセスには何か問題があります。私はServer processを終了しなければならず、Client processを起動することができます。 Pythonでこのマルチプロセスをシェルコマンドで実装する方法を教えてもらえますか?

答えて

0

os.systemブロックなので、実行されるまで親スレッドはブロックされます(java Serverコールの場合は、決して終了しないことを意味します)。

これを回避する簡単な方法は、subprocessモジュールを使用することです(os.systemを使用することをお勧めします)。

import subprocess 

commands = [ 
    'java Server 2', 
    'java Client 0 2', 
    'java Client 1 2' 
] 

# using subprocess.Popen will run sub-processes in parallel 
java_procs = [subprocess.Popen(command, shell=True) for command in commands] 

# now wait for the processes to finish? 
for p in java_procs: p.wait() 

あなたはより深刻なマルチプロセッシング/並列プロセスの実行が必要な場合は、multiprocessingモジュールは、通常、より良い勧告です。

+0

ご返信ありがとうございます。私はこのメソッドを試してみたところ、 'java.rmi.server.ExportException:ポートはすでに使用中です:1099;ネストされた例外は次のとおりです。 \t java.net.BindException:2回目にスクリプトを実行すると、アドレスはすでに使用中(バインドに失敗しました)です。これは、プロセスを自分でkillするために 'for java_procs:p.kill()'のようなものを追加する必要があるのでしょうか? –

+0

@Coding_Rabbitサーバを起動する必要があります。クライアントは、すべてのクライアントが 'wait'で終了するのを待ちます。その後、サーバーを停止します - このサーバーをPythonスクリプトで開始および停止させたい場合。 – birryree

関連する問題