Python从函数返回时挂起

时间:2013-05-13 21:25:57

标签: python flask zeromq

所以说我在一个相当复杂的Flask应用程序中有两个函数。一个函数调用另一个函数。

def dispatch_unlock(...):
    # ... stuff ...
    log('dis start')
    # this routine just sends some data over a ZMQ IPC socket
    # in this scenario, the socket send will time out
    ret = acl.enqueue(unlock.id, endpoint_id, filter_entry['service_id'])
    log('dis end')
    return ret

def something_else(...);
    # ... stuff ...
    log('routecall start')
    ret = dispatch_unlock(unlock, endpoint_id, endpoint, f)
    log('routecall end')
    return ret

运行something_else时,会生成以下输出:

routecall start
dis start
dis end

之后,它就会挂掉。我尝试转储Python堆栈跟踪,但它们没有显示任何有用的东西。一个堆栈跟踪位于Werkzurg重新加载器中,另一个是堆栈跟踪,通向SIGUSR1调用的转储器。

有谁能说明到底是怎么回事? Python调用堆栈是否以某种方式被破坏了?

编辑:以下是pdb在返回之前单独执行执行时所显示的内容。看起来dispatch_unlock调用框架上方的框架会以某种方式丢失。

> /SourceCache/Florence/lib/plugin/route.py(27)dispatch_unlock()
-> return ret
(Pdb) s
--Return--
> /SourceCache/Florence/lib/plugin/route.py(27)dispatch_unlock()->None
-> return ret
(Pdb) s

1 个答案:

答案 0 :(得分:2)

这不是一个错误,它是一个功能

当试图垃圾收集对象并关闭由于端点不存在而未打开的ZMQ IPC套接字时,Python挂起了(这是正常的,因为我正在进行测试)。显然,在这种情况下,ZMQ意味着无限期挂起(这花了我很长时间才弄明白,因为没有记录在任何地方)。通过设置解决问题的ZMQ套接字的LINGER属性可以避免这种情况。