此代码应该尝试启动服务器进程并返回。 如果端口被占用,它应该说“无法绑定到该端口”并返回。如果服务器启动,它应该打印“绑定到端口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()
我可以抛出一些可以进行多处理的开关,让我这样做吗?
答案 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界面来管理您的流程。