繁体   English   中英

在Python中控制多个子流程?

[英]Controlling multiple subprocesses in Python?

我想编写一个可以启动和杀死多个子进程的python脚本(每个python脚本实现一个小的TCP服务器),并在它们运行时从中检索输出。 有没有为此专用的模块,还是应该继续使用子流程?

似乎您正在寻找multiprocessing模块 它的接口类似于线程模块之一

您可以手动启动每个进程,可以使用Pool管理它们

他们可以使用管道或队列进行通信,或者更轻松地与Manager对象进行通信

可以通过读取子进程写入的文本文件来检索它们的输出。或者您可以使用本质上相同的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>

这可能是服务器的核心。

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

当其他进程完成时,当新的连接进入时,这些进程将被视为僵尸进程并获得收益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM