複数のサブプロセス (小さな TCP サーバーを実装する各 python スクリプト) を起動して強制終了できる python スクリプトを作成し、実行中にそれらから出力を取得したいと考えています。これには特定のモジュールがありますか、それとも先に進んでサブプロセスを使用する必要がありますか?
質問する
226 次
2 に答える
0
それらからの出力の取得は、サブプロセスが書き込むテキストファイルを読み取ることで実行できます..または、Pickle
本質的に同じものを使用できます..
使用例:
child_count=pickle.load( open("child_count.p", "rb"))
child_count-=counter
pickle.dump( child_count, open("child_count.p", "wb"))
あなたのtcpサーバーの場合..新しいプロセスを「起動」し、プロセスが完了すると、リスナーが再び強制終了されるというアイデアがあると思います。
def reap():
#Collect child processes
while 1:
try:
result = os.waitpid(-1, os.WNOHANG)
if not result[0]: break
except:
break
print "Reaped child process %d" % result[0]
host = ''
port = 4200
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)
print "Parent at %d listening for connections" % os.getpid()
while 1:
try:
clientsock, clientaddr = s.accept();clientsock.settimeout(90)
print "Accepting connection"
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue
reap()
#Clone/fork
try:
pid = os.fork()
except:
print "SOMETHING BAD HAPPENED.. fork failed!"
clientsock.close()
continue
if pid:
clientsock.close()
#Cleanup old children
continue
else:
print "New child", os.getpid()
s.close()
#try:
print "Got connection frommm: ", clientsock.getpeername()
data = clientsock.recv(1024)
<ENTER your code for the process here>
これは、サーバーのコアになる可能性があります。
それが何をするか、それは接続を受け入れ、次に自分自身をフォークし、フォーク/クローンされた部分がプロセスを処理する間、他の着信接続をリッスンし続けます。
他のプロセスが完了している間に新しい接続が入ると、そのプロセスはゾンビ プロセスとして認識され、リープされます。
于 2013-06-10T07:37:49.033 に答える
0
multiprocessing モジュールを探しているようです。インターフェースはthreading モジュールのものと似ています。
それらは、Pipe または Queueを使用して通信できます。または、より簡単にManager オブジェクトを使用して通信できます。
于 2013-06-10T07:31:38.680 に答える