2011-09-13 11 views
3

次のコード(ここから取ら:https://bitbucket.org/denis/gevent/src/6c710e8ae58b/examples/wsgiserver_ssl.pyは)非常に速いgreenletパワードのWSGI Webサーバを実装します。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() 

しかし、これは唯一つのコア上で実行されます。複数のプロセスを利用するには、これをどのように変更しますか?ガンコーンを含む答えを探していない、もっと簡単なものを探している。ここで

ヒント

は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つのポートが1つよりも速いことを理解しなければなりません。したがって、6つのポートでnginxのバランスをとる6つのプロセスがこれより優れています。 –

+0

これを行うと、nginix上でポートのボトルネックが発生しています。 – pokstad

+0

これは本当ですが、とにかくあなたはあなたのために(なぜセキュリティ上の理由で)あなたのために逆プロキシを使用していますので、上流も使用しないでください?ベーターは1対1から多対1を使用する。 –

0

GIPCと呼ばれるこの問題のためにgeventで動作するユーティリティもあります。

https://gehrcke.de/gipc/

利点は、あなたがプロセスから前後にオブジェクトを渡すと通信できることです。ちょっとした考え。

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 18954491) – BoarGules

関連する問題