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

2024-09-28 13:05:23 发布

您现在位置:Python中文网/ 问答频道 /正文

当我尝试telnet进入服务器时,代码永远不会到达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()

Tags: fromimportselfsignalserverdeftimeoutgevent
1条回答
网友
1楼 · 发布于 2024-09-28 13:05:23

documentation可以看到:

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。在

相关问题 更多 >

    热门问题