2013-01-17 1 views
1

서버에 텔넷을 연결하려고 시도하면 코드가 print 'never reach1' 또는 print 'never reach2'에 도달하지 않습니다.gevent timeout 예외가 내 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를 사용하지 않고 간단하게 "절전"하는 방법을 만들려면 Timeout 대신 간단한 time.sleep을 사용하는 것이 좋습니다.