2012-02-13 8 views
6

나는 Greenlet을 생성하고 호출 가능하도록 링크했습니다. 얼마 후, Greenlet은 예외로 실패합니다. 연결된 호출 가능 객체가 호출됩니다. 그게 다야! 예상대로,gevent에서 추적 코드를 캡처하는 방법

예외에 대한 역 추적 내 콘솔에 나타납니다

는 여기에 문제가 있습니다. 하지만 연결된 콜 가능 내에서 그 추적 표시로 일을하고 싶습니다. 연결된 호출 가능 함수 내에서 해당 추적에 대한 액세스 권한을 얻으려면 어떻게해야합니까?

답변

15

Greenlet이 죽으면 추적 표시가 의도적으로 저장되지 않습니다. 그것이 저장 되었다면, 삭제 될 것으로 예상되는 많은 객체들을 유지할 것인데, 특히 객체가 어떤 자원 (열린 파일 또는 소켓)을 관리하는 경우에 중요합니다.

추적 코드를 저장하려면 직접해야합니다.

+1

그리고 그것은 권위있는 대답입니다. 고마워, 데니스. – kkurian

1

Greenlet 객체는 당신이 볼 수있는 exception 속성을 가져야한다 (나의 첫번째 본능은 그 링크 된 호출 자체가 아니라 예외에 대한 역 추적을 제공 밝혀졌습니다. traceback.extract_stack()을 사용했지만) :

http://www.gevent.org/gevent.html#gevent.Greenlet.exception

+1

어떻게 추적 추적을 얻을 수 있습니까? – kkurian

1

그냥 당신이 Greenlet의 exception 값을 잡아 예를 들어, Greenlet 밖에 던져 값 중 하나를 반환 get 반환 또는 INTERNA을 제기해야합니다 나는 예외 다.

import traceback 
import gevent 

def fail(): 
    return 0/0 

gl = gevent.spawn(fail) 

try: 
    gl.get() 
except Exception as e: 
    stack_trace = traceback.format_exc() # here's your stacktrace 

필요한 것을 제공해야합니다.

+0

링크 된 호출 가능 코드 (예 : foo = gevent.Greenlet (x); foo.link_exception (bar); foo.start(); ;) - bar() 내에서 제안한 것을 수행하면 foo에서 발생한 Exception에 대한 추적을 생성하지 않으므로 Exception에 대한 추적을 막대 형태로 생성합니다. – kkurian

+0

아마도 위 코드를 붙여야합니다. 문제가 범위 지정 문제로 보이고 범위를 설정하는 방법을 알면 디버깅하기가 더 쉬울 것입니다. –

0

Greenlet.link_exception을 사용하는 Stephen Diehl 솔루션 대신 사용할 수 있습니다.

import traceback 

import gevent 

def job(): 
    raise Exception('ooops') 

def on_exception(greenlet): 
    try: 
     greenlet.get() 
    except Exception: 
     err = traceback.format_exc() 
     # Do something with `err` 

g = gevent.spawn(job) 
g.link_exception(on_exception) 
+0

생성, 링크 및 시작 링크가 아닌 생성 링크가 생성됩니까? 실용적인 차이점이 있습니까? – kkurian

+0

그리고 이것이 Diehl의 해결책에 대한 논평에서 제기 한 우려 사항을 해결합니까? – kkurian

+0

글쎄, 이론적으로 그린렛은 링크가 이런 방식으로 만들어지기 전에 충돌 할 수 있다고 생각합니다. – renstrm

관련 문제