在Python中控制多个子进程?

在Python中控制多个子进程?,python,subprocess,Python,Subprocess,我想编写一个python脚本,它可以启动和终止多个子进程(每个子进程都是实现一个小型TCP服务器的python脚本),并在它们运行时检索它们的输出。有专门的模块吗?或者我应该继续使用subprocess吗?看起来您正在寻找。该接口与的接口类似 你可以也可以 它们可以使用或更容易地与进行通信。通过读取子进程写入的文本文件,可以从中检索输出。。或者您可以使用基本相同的Pickle 用法示例: child_count=pickle.load( open("child_count.p", "rb"))

我想编写一个python脚本,它可以启动和终止多个子进程(每个子进程都是实现一个小型TCP服务器的python脚本),并在它们运行时检索它们的输出。有专门的模块吗?或者我应该继续使用subprocess吗?

看起来您正在寻找。该接口与的接口类似

你可以也可以


它们可以使用或更容易地与进行通信。

通过读取子进程写入的文本文件,可以从中检索输出。。或者您可以使用基本相同的
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>
def reau():
#收集子进程
而1:
尝试:
结果=os.waitpid(-1,os.WNOHANG)
如果不是结果[0]:则中断
除:
打破
打印“收获的子进程%d”%结果[0]
主机=“”
端口=4200
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
s、 绑定((主机、端口))
s、 听(1)
打印“在%d处侦听连接的父项”%os.getpid()
而1:
尝试:
clientsock,clientaddr=s.accept();clientsock.settimeout(90)
打印“接受连接”
除键盘中断外:
提升
除:
traceback.print_exc()
持续
收获
#克隆/分叉
尝试:
pid=os.fork()
除:
打印“发生了不好的事情……fork失败!”
clientsock.close()
持续
如果pid:
clientsock.close()
#清理年迈儿童
持续
其他:
打印“新子对象”,os.getpid()
s、 关闭()
#尝试:
打印“从MM获得连接:”,clientsock.getpeername()
data=clientsock.recv(1024)
这可能是服务器的核心

它所做的是,它接受一个连接,然后分叉自身,继续侦听其他传入连接,而分叉/克隆的部分将处理该过程

当其他进程完成时,新连接将进入时,这些进程将被识别为僵尸进程,并将被捕获