网上找的大部分代码都是过时的,查找gevent源码和CHANGELOG才知道:
-
pre_start 变为init_socket
-
_stopped_event变为_stop_event
-
每个进程需要gevent.wait
pre_start() method is renamed to init_socket() - renamed _stopped_event to _stop_event
multi_streamserver.py
# -*- coding: utf-8 -*-
from gevent import monkey; monkey.patch_os()
from gevent.server import StreamServer
from multiprocessing import Process
import gevent
def eat_cpu():
for i in xrange(10000000):
pass
def connection_handler(socket, address):
eat_cpu()
socket.recv(1024)
socket.sendall('HTTP/1.1 200 OK\n\nHello!')
socket.close()
server = StreamServer(('0.0.0.0', 6000), connection_handler, backlog=100000)
server.init_socket() # *1
def serve_forever():
server.start_accepting() # *2
server._stop_event.wait() # *3
gevent.wait() # *4
process_count = 3
processes = []
for i in range(process_count):
p = Process(target=serve_forever, args=tuple())
p.start()
processes.append(p)
try:
print "main process does nothing!.."
for p in processes:
p.join()
except KeyboardInterrupt:
print "bye"
multi_wsgiserver.py
# -*- coding: utf-8 -*-
from gevent import monkey; monkey.patch_os()
from gevent.pywsgi import WSGIServer
from multiprocessing import Process
import gevent
def _app(environ, start_response):
start_response('200 OK', [('Content-Type','text/plain')])
yield "hello\n"
server = WSGIServer(('0.0.0.0', 6000), _app, backlog=100000, log=None)
server.init_socket()
def serve_forever():
server.start_accepting()
server._stop_event.wait()
gevent.wait()
process_count = 2
processes = []
for i in range(process_count):
p = Process(target=serve_forever, args=tuple())
p.start()
processes.append(p)
try:
print "main process does nothing!.."
for p in processes:
p.join()
#serve_forever()
except KeyboardInterrupt:
print "bye"
总结: 1.在普通tcp(multi_streamserver.py)中多进程会降低性能,不建议试用....而在wsgi中确实能成倍提升性能, 这样就不需要gunicorn了
2.针对wsgi服务: 在主进程里面也运行wsgi服务的话会降低性能,所以只需要开启多个子进程运行wsgi服务,主进程做额外的控制工作