Удалить трассировку стека из вывода Python Gevent - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в python и пытаюсь удалить / обрезать вывод стека трассировки Gevent при возникновении исключения.Я где-то читал, что я могу сделать это, используя AsyncResult, однако мне кажется, что я не могу понять, как это использовать.

Вот пример, с которого я начал и итерировал, чтобы сделать его похожим нав реальном коде я устраняю неполадки, но я застрял на последнем этапе, когда попытался добавить my_decor в work ().Любая помощь в исправлении этого очень ценится.

from gevent.event import AsyncResult
import gevent
from functools import wraps


def my_decor(k, *args, **kwargs):
    @wraps(k)
    def wrapper(*args, **kwargs):
        r = AsyncResult()
        try:
            value = k()
        except Exception as e:
            r.set_exception(e)
        else:
            r.set(value)
        return r.exception or r.value
    result = gevent.spawn(wrapper, k)
    return result


def f():
    def foo():
        if True:
                raise Exception('tttttttt')
    return foo


def p():
    def bar():
        if True:
                raise Exception('ppppppppppppp')
    return bar


@my_decor
def work():
    foo1 = gevent.spawn(f())
    bar1 = gevent.spawn(p())
    gevent.joinall([foo1, bar1])
    return foo1.get() or bar1.get()

1 Ответ

0 голосов
/ 01 марта 2019

Нашел ответ, подумал, что это может помочь тем, у кого такая же проблема.

from gevent.event import AsyncResult
import gevent
from functools import wraps


def my_decor(k):
    @wraps(k)
    def wrapper(*args, **kwargs):
        r = AsyncResult()
        try:
            value = k(*args, **kwargs)
        except Exception as e:
            r.set_exception(e)
        else:
            r.set(value)
        return r.exception or r.value
    return wrapper


def f(msg):
    @my_decor
    def foo():
        if True:
            raise Exception('tttttttt %s' % msg)
#           print('test')
    return foo


def p(msg):
    @my_decor
    def bar():
        if True:
            raise Exception('ppppppppppppp %s', msg)
    return bar


def work():
    test = "test"
    seti = "set"
    foo1 = gevent.spawn(f(test))  # returns a function that coroutine uses
    bar1 = gevent.spawn(p(seti))
    gevent.joinall([foo1, bar1])
    return foo1.get() or bar1.get()


res = work()
print res
...