我想编写一个 python 脚本,它可以启动和终止多个子进程(每个子进程都是实现一个小型 TCP 服务器的 python 脚本),并在它们运行时从它们检索输出。是否有一个特定的模块或者我应该继续使用子流程?
问问题
226 次
2 回答
0
看来您正在寻找multiprocessing 模块。它的接口类似于线程模块之一。
您可以手动启动每个进程或使用 Pool 管理它们。
它们可以使用Pipe 或 Queue进行通信,或者更容易与Manager 对象进行通信。
于 2013-06-10T07:31:38.680 回答
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 回答