2011-09-13 5 views
3

(여기에서 촬영 : https://bitbucket.org/denis/gevent/src/6c710e8ae58b/examples/wsgiserver_ssl.py) 다음 코드를 매우 빠른 greenlet 전원 WSGI 웹 서버를 구현합니다Gevent Pywsgi Server - 멀티 프로세싱?

#!/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() 

그러나 이것은 단지 하나 개의 코어에서 실행됩니다. 여러 프로세스를 이용하려면 어떻게 수정해야합니까? gunicorn과 관련된 대답을 찾지 않고보다 간단한 것을 찾고 있습니다. 여기에 힌트

는 gevent 및 멀티 프로세싱을 사용하여 코드 샘플입니다,하지만, 난 여전히 (https://gist.github.com/1169975에서 촬영) WSGI이 작업하는 방법을 알아낼 수 없습니다 : 그래서

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) 

답변

4

을 같은 방식으로 이것을 만들지 않는 이유는 무엇입니까? https://gist.github.com/1217855

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) 
+0

하지만 당신은 다음 6 포트가 더 나은 다음이 작동합니다 nginx 균형과 1 및 faster.So 6 프로세스가 beter 이해해야합니다. –

+0

이렇게하면 nginix에서 포트 병목 현상이 발생합니다. – pokstad

+0

이것은 사실이지만, 어쨌든 파이썬 서버 (보안상의 이유로)를 위해 역방향 프록시를 사용할 것입니다. 그렇다면 왜 업스트림도 사용하지 마십시오? 베터 (Beter)는 하나에서 많은 것을 하나씩 사용합니다. –

0

도 GIPC이라는 문제에 대한 gevent 함께 작동하는 유틸리티입니다.

https://gehrcke.de/gipc/

장점은 프로세스에서 앞뒤로 개체를 전달하고 의사 소통을 할 수 있다는 것입니다. 그냥 생각.

+0

이 링크는 질문에 대답 할 수 있지만 답변의 핵심 부분을 여기에 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [리뷰에서] (리뷰/저품절 포스트/18954491) – BoarGules

관련 문제