tornado网络服务器无限子进程分叉
http://tornado.readthedocs.org/en/latest/tcpserver.html#tornado.tcpserver.TCPServer.start
http://tornado.readthedocs.org/en/latest/httpserver.html
server = HTTPServer(app)
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.instance().start()
当我在server.start()里设置为0时,tornado会最多创建X个子进程(X的值等于机器的核心数,我的机器有4个核心)。
为了测试这个,我有两个控制器,一个控制器(A)里有一个sleep(9999)的代码,另一个快速的控制器(B)只返回“hello world”。
当我同时向控制器A发起3个请求,再加上一个请求给控制器B时,一切都正常,返回了“hello world”。
但是当我同时向控制器A发起4个请求,再加上一个请求给控制器B时,控制器B的请求就会被阻塞,得等着。
我该怎么做才能不限制创建的子进程数量呢?
谢谢!
1 个回答
1
没有办法让程序同时启动无限数量的子进程。文档中是这么说的:
如果设置的进程数量(num_processes)是空的或者小于等于0,我们会检测这台机器上可用的核心数量,然后启动相应数量的子进程。如果给定了一个大于1的进程数量,我们就会启动这个具体的子进程数量。
你可以指定一个很大的数字,但我觉得在超过你系统核心数量不久后,性能就会开始下降。
Tornado其实并不是为了同时启动很多子进程而设计的。Tornado的一个主要特点是异步输入输出,这让它能够处理比num_processes
更多的同时连接。例如,如果你把A控制器中的sleep(9999)
替换成一个非阻塞的睡眠,你就能几乎立刻处理所有连接到B控制器的请求。