Python Gevent Pywsgi服务器-多处理?

Python Gevent Pywsgi服务器-多处理?,python,webserver,wsgi,gevent,greenlets,Python,Webserver,Wsgi,Gevent,Greenlets,以下代码(取自此处:)实现了一个以greenlet为动力的速度极快的wsgi Web服务器: #!/usr/bin/python """Secure WSGI server example based on gevent.pywsgi""" from gevent import pywsgi def hello_world(env, start_response): if env['PATH_INFO'] == '/': start_response('200 OK

以下代码(取自此处:)实现了一个以greenlet为动力的速度极快的wsgi Web服务器:

#!/usr/bin/python
"""Secure WSGI server example based on gevent.pywsgi"""

from gevent import pywsgi


def hello_world(env, start_response):
    if env['PATH_INFO'] == '/':
        start_response('200 OK', [('Content-Type', 'text/html')])
        return ["<b>hello world</b>"]
    else:
        start_response('404 Not Found', [('Content-Type', 'text/html')])
        return ['<h1>Not Found</h1>']

print 'Serving on https://127.0.0.1:8443'
server = pywsgi.WSGIServer(('0.0.0.0', 8443), hello_world, keyfile='server.key', certfile='server.crt')
# to start the server asynchronously, call server.start()
# we use blocking serve_forever() here because we have no other jobs
server.serve_forever()

那么,为什么不以同样的方式来做呢?

导入系统 从gevent导入服务器 从gevent.baseserver导入\u tcp\u侦听器 从gevent导入pywsgi 从gevent.monkey导入补丁_all;patch_all() 来自多处理导入进程、当前进程、cpu计数 def hello_world(环境,启动响应): 如果环境['PATH_INFO']=='/': 开始响应('200OK',[('Content-Type','text/html')) return[“你好,世界”] 其他: 启动响应('404未找到',[('Content-Type','text/html')) 返回['notfound'] 侦听器=_tcp_侦听器(('127.0.0.1',8001)) def永远为您服务(听众): WSGIServer(listener,hello_world).SERVICE_forever() 进程数=5 打印“正在启动%s个进程”%u个进程的数量 对于范围内的i(进程数): 进程(target=serveforever,args=(listener,).start() 永远为你服务(听众)
还有一个与gevent一起解决此问题的实用程序,称为GIPC


其优点是您可以从进程来回传递对象并进行通信。只是一个想法

但您必须了解,6个端口比1个端口更好更快。因此,6个进程在6个端口上使用nginx平衡将比这更好。如果这样做,您仍然会在nginix上创建单端口瓶颈。这是真的,但无论如何,您将为python服务器使用反向代理(出于安全原因),那么为什么不同时使用上游呢?最好使用一对多,然后使用一对多。此服务器容易受到什么类型的安全问题的攻击?它似乎对DoS攻击和其他占用内存的攻击有更好的保护。在前端使用代理难道不会消除使用greenlet的优势吗?如果没有反向代理,您的应用程序可能会做一些意想不到的事情,或者干脆杀死DB,或者其他什么。但使用反向代理时,受攻击的代理将是唯一的代理。还有反向代理,您可以使用HTTPS,这比在应用程序端使用HTTPS要好得多。
import sys
from gevent import server
from gevent.baseserver import _tcp_listener
from gevent.monkey import patch_all; patch_all()
from multiprocessing import Process, current_process, cpu_count


def note(format, *args):
    sys.stderr.write('[%s]\t%s\n' % (current_process().name, format%args))

def echo(socket, address):
    print 'New connection from %s:%s' % address
    fileobj = socket.makefile()
    fileobj.write('Welcome to the echo server! Type quit to exit.\r\n')
    fileobj.write('In %s\r\n' % current_process().name)
    fileobj.flush()
    while True:
        line = fileobj.readline()
        if not line:
            print "client disconnected"
            break
        if line.strip().lower() == 'quit':
            print "client quit"
            break
        fileobj.write(current_process().name + '\t' + line)
        fileobj.flush()
        print "echoed", repr(line)

listener = _tcp_listener(('127.0.0.1', 8001))

def serve_forever(listener):
    note('starting server')
    server.StreamServer(listener, echo).serve_forever()

number_of_processes = 5
print 'Starting %s processes' % number_of_processes
for i in range(number_of_processes):
    Process(target=serve_forever, args=(listener,)).start()

serve_forever(listener)
import sys
from gevent import server
from gevent.baseserver import _tcp_listener
from gevent import pywsgi
from gevent.monkey import patch_all; patch_all()
from multiprocessing import Process, current_process, cpu_count

def hello_world(env, start_response):
    if env['PATH_INFO'] == '/':
        start_response('200 OK', [('Content-Type', 'text/html')])
        return ["<b>hello world</b>"]
    else:
        start_response('404 Not Found', [('Content-Type', 'text/html')])
        return ['<h1>Not Found</h1>']

listener = _tcp_listener(('127.0.0.1', 8001))

def serve_forever(listener):
    pywsgi.WSGIServer(listener, hello_world).serve_forever()

number_of_processes = 5
print 'Starting %s processes' % number_of_processes
for i in range(number_of_processes):
    Process(target=serve_forever, args=(listener,)).start()

serve_forever(listener)