为什么我的 except 子句从来没有捕获到 gevent 超时异常?

问题描述 投票:0回答:1

当我尝试远程登录服务器时,代码永远不会到达

print 'never reach1'
print 'never reach2'
行。

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

class SocketPool(object):

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

    def listen(self, socket):
        while True:
            line = socket.recv(1024)
            print line

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

    def wait(self):
        try:
            timeout = Timeout(1)
            timeout.start()
        except Timeout:
            print 'never reach1'
        except:
            print 'never reach2'

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

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

signal.signal(signal.SIGINT, signal_handler)
monkey.patch_all()
sockPool = SocketPool()
server = StreamServer(('127.0.0.1', 5000), sockPool.add_handler)
server.serve_forever()
python timeout gevent
1个回答
2
投票

正如您从文档中看到的:

timeout = Timeout(seconds, exception)
timeout.start()
try:
    ...  # exception will be raised here, after *seconds* passed since start() call
finally:
    timeout.cancel()

因此您的

try
块已完全执行,因此无法捕获异常。 您应该放置类似
while
循环或需要至少 1 秒才能看到异常的计算。

如果您想创建一个不使用 CPU 的简单“睡眠”方法,我建议使用简单的

time.sleep
而不是使用
Timeout

© www.soinside.com 2019 - 2024. All rights reserved.