使用扭曲和绿色按钮时出错

亚历克斯·霍基

我正在尝试将Twisted与greenlets一起使用,因此可以在不使用inlineCallbacks的情况下以twisted形式编写同步外观的代码。

这是我的代码:

import time, functools
from twisted.internet import reactor, threads
from twisted.internet.defer import Deferred
from functools import wraps
import greenlet

def make_async(func):
    @wraps(func)
    def wrapper(*pos, **kwds):
        d = Deferred()

        def greenlet_func():
            try:
                rc = func(*pos, **kwds)
                d.callback(rc)
            except Exception, ex:
                print ex
                d.errback(ex)

        g = greenlet.greenlet(greenlet_func)
        g.switch()

        return d
    return wrapper

def sleep(t):
    print "sleep(): greenelet:", greenlet.getcurrent()
    g = greenlet.getcurrent()
    reactor.callLater(t, g.switch)
    g.parent.switch()

def wait_one(d):
    print "wait_one(): greenelet:", greenlet.getcurrent()
    g = greenlet.getcurrent()
    active = True

    def callback(result):
        if not active:
            g.switch(result)
        else:
            reactor.callLater(0, g.switch, result)

    def errback(failure):
        if not active:
            g.throw(failure)
        else:
            reactor.callLater(0, g.throw, failure)

    d.addCallback(callback)
    d.addErrback(errback)

    active = False
    rc = g.parent.switch()
    return rc

@make_async
def inner():
    print "inner(): greenelet:", greenlet.getcurrent()

    import random, time
    interval = random.random()

    print "Sleeping for %s seconds..." % interval
    sleep(interval)
    print "done"

    return interval

@make_async
def outer():
    print "outer(): greenelet:", greenlet.getcurrent()
    print wait_one(inner())
    print "Here"

reactor.callLater(0, outer)
reactor.run()

有五个主要部分:

  • 睡眠功能,它启动计时器,然后切换回父级greenlet。当计时器关闭时,它会切换回正在休眠的greenlet。
  • 一个make_async装饰器。这需要一些看起来同步的代码,并在greenlet中运行它。IT还返回一个deferr,以便在代码完成后,调用方可以注册回调。
  • 一个wait_one函数,该函数阻止greenlet直到延迟等待解决。
  • 内部函数(在包装时)返回延迟的函数,它会休眠一段随机时间,然后将其睡眠的时间传递给延迟的函数。
  • 调用inner()的外部函数等待其返回,然后输出返回值。

当我运行此代码时,我得到以下输出(注意最后两行的错误):

outer(): greenelet: <greenlet.greenlet object at 0xb729cc5c>
inner(): greenelet: <greenlet.greenlet object at 0xb729ce3c>
Sleeping for 0.545666723422 seconds...
sleep(): greenelet: <greenlet.greenlet object at 0xb729ce3c>
wait_one(): greenelet: <greenlet.greenlet object at 0xb729cc5c>
done
0.545666723422
Here
Exception twisted.python.failure.Failure: <twisted.python.failure.Failure <class 'greenlet.GreenletExit'>> in <greenlet.greenlet object at 0xb729ce3c> ignored
GreenletExit did not kill <greenlet.greenlet object at 0xb729ce3c>

经过一些研究,我发现:

  • 最后一行由greenlet.c记录
  • 上一行是python本身记录的,因为它忽略了del方法中引发的异常

我在调试它时遇到了麻烦,因为我无法访问GreenletExittwisted.python.failure.Failure异常来获取其堆栈跟踪。

有谁知道我在做什么错,或者我如何调试正在抛出的异常?

另一个数据点:如果我修改wait_one()使其立即返回(并且不对延迟传递的任何内容进行注册),则错误会消失。:-/

姆吉耶尔

wait_one像这样重写您的错误回调

  def errback(failure):
    ## new code
    if g.dead:
        return
    ##
    if not active:
        g.throw(failure)
    else:
        reactor.callLater(0, g.throw, failure)

如果greenlet已死(运行结束),则没有任何异常抛出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用活动的x按钮复制和粘贴时出错

来自分类Dev

使用量角器和Cucumingjs选择单选按钮选项时出错

来自分类Dev

使用FFMPEG和Python编码视频时出现绿色条纹伪像

来自分类Dev

使用扭曲和试用版启动两个等效的单元测试时,ReactorNotRestartable

来自分类Dev

使用Selenium Webdriver和FireFox时出错

来自分类Dev

使用Retrofit和Rxjava时出错

来自分类Dev

使用XHProf和XHGui时出错

来自分类Dev

的python:使用strptime和timedelta时出错

来自分类Dev

使用IBM WAS ConnectionFactory和Spring时出错

来自分类Dev

使用shlex和子流程时出错

来自分类Dev

使用 TcpClient 和 StreamWriter 时出错

来自分类Dev

使用 fprintf 和 fscanf 时出错

来自分类Dev

使用 setOnclickListener 和 View 时出错

来自分类Dev

绿色():和;

来自分类Dev

在视图中使用按钮触发操作时出错

来自分类Dev

尝试放置操作按钮时出错(使用Json方法)

来自分类Dev

使用@Required和@Autowired时创建bean时出错

来自分类Dev

再次单击按钮时出错

来自分类Dev

编写按钮方法时出错

来自分类Dev

使用Mencoder录制时,HDMI到S-Video转换器和Linux产生绿色故障

来自分类Dev

同时使用单选按钮和按钮时,Python程序挂起

来自分类Dev

使用vim时如何删除该绿色区域?

来自分类Dev

使用swift时通话中的额外参数为绿色

来自分类Dev

在Python中使用OpenCV扭曲点时的不良结果

来自分类Dev

启动扭曲电抗器时的CPU使用率

来自分类Dev

在CSS中使用边框半径时扭曲的圆

来自分类Dev

启动扭曲电抗器时的CPU使用率

来自分类Dev

使用scrapy爬行bbs时发生扭曲失败

来自分类Dev

使用过量提交和Github Desktop时出错

Related 相关文章

热门标签

归档