在Python中分叉并退出

时间:2010-07-28 18:09:41

标签: python fork

此代码应该尝试启动服务器进程并返回。 如果端口被占用,它应该说“无法绑定到该端口”并返回。如果服务器启动,它应该打印“绑定到端口51231”并返回。但它没有回归。

import socket
from multiprocessing import Process

def serverMainLoop(s,t):
    s.listen(5)
    while 1:
        pass # server goes here

host = ''
port = 51231
so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    so.bind((host,port))
    print "Bound to port %i"%port
    serverProcess = Process(target=serverMainloop, args=(so,60))
    serverProcess.start()
    sys.exit()
except socket.error, (value,message):
    if value==98:
        print "couldn't bind to that port"
    sys.exit()

我可以抛出一些可以进行多处理的开关,让我这样做吗?

3 个答案:

答案 0 :(得分:4)

检查this页面,它描述了如何使用os.fork()os._exit(1)构建一个后台分叉的守护进程。

你可能想要的原型是:

pid = os.fork()
if (pid == 0): # The first child.
   os.chdir("/")
   os.setsid()
   os.umask(0) 
   pid2 = os.fork() 
   if (pid2 == 0):  # Second child
     # YOUR CODE HERE
   else:
     sys.exit()    #First child exists
else:           # Parent Code
  sys.exit()   # Parent exists

为什么要分叉两次see this问题(短版本:需要孤立孩子并使其成为初始化过程的孩子)

答案 1 :(得分:1)

为了做你所描述的,我不会使用多处理,我会考虑写一个daemon

答案 2 :(得分:0)

作为编写守护程序的替代方法,只需将程序编写为控制台进程(对其进行测试),并使用supervisord等服务管理应用程序将其作为服务运行。 Supervisord还可以将您的程序作为服务运行。它将监控,重启,记录,报告状态和状态变化,甚至提供最小的Web界面来管理您的流程。