3

サーバーに telnet で接続して何かを入力すると、出力が 'after spawn' と出力され、次に 'after sleep' と出力されることを期待しますが、逆になります。なぜそのようになっているのですか?そして、それを行うにはどうすれば修正できますか?

import sys, signal
from gevent.server import StreamServer
from gevent.pool import Pool
from gevent import monkey
import gevent

def signal_handler(signal, frame): sys.exit(0)

class SocketPool(object):

    def __init__(self): self.pool = Pool(1000)

    def listen(self, socket):
        while True:
            line = socket.recv(1024)
            if not line:
                socket.close()
                break
            gevent.spawn(self.wait).join()
            print 'after spawn'

    def add_handler(self, socket, address):
        if self.pool.full(): raise Exception("At maximum pool size")
        else: self.pool.spawn(self.listen, socket)

    def wait(self):
        gevent.sleep(7)
        print 'after sleep'

    def shutdown(self): self.pool.kill()

signal.signal(signal.SIGINT, signal_handler)
monkey.patch_all()
sockPool = SocketPool()
server = StreamServer(('127.0.0.1', 5000), sockPool.add_handler)
server.serve_forever()
4

1 に答える 1

3

joingreenlet を生成した後、呼び出しを削除します。このjoinグリーンレットが完成するまでお待ちください。

于 2013-01-18T07:31:02.557 に答える