2013-01-17 16 views
1

當我嘗試遠程登錄到服務器時,代碼永遠不會到達print 'never reach1'print 'never reach2'行。怎麼來gevent超時異常不會被我的except子句捕獲?

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() 

回答

2

你可以從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