gevent 多进程(新)

网上找的大部分代码都是过时的,查找gevent源码和CHANGELOG才知道:

  1. pre_start 变为init_socket

  2. _stopped_event变为_stop_event

  3. 每个进程需要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服务,主进程做额外的控制工作

你可能感兴趣的:(gevent 多进程(新))