【问题标题】:How come the gevent timeout exception is never caught by my except clause?为什么我的 except 子句永远不会捕获 gevent 超时异常?
【发布时间】:2013-01-17 05:36:09
【问题描述】:

当我尝试远程登录服务器时,代码永远不会到达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】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2020-09-22
      • 2014-07-09
      • 2020-02-17
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多