Python 在函数返回时挂起

标签 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

最佳答案

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

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

关于Python 在函数返回时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531407/

相关文章:

python Flask SocketIO 使用 eventlet 抛出 SSL 错误

c++ - 如何通过 ZMQ 发送 Cap'n Proto 消息

python - 如何测试一个序列是否以另一个序列中的值开头?

python - 与 Google App Engine 和 BigTable 的递归关系

json - 'User' 类型的对象不是 JSON 可序列化的(父类)

javascript - Flask、html 和 javascript 桌面应用程序

c++ - 如何有效地将偶尔遇到的参数传递给子线程?

c - "Server"到 "Server"ZeroMQ 通信

python - 将容器添加到 python 中预先存在的对象的简单但正确的方法是什么?

python - 错误 "TypeError: type numpy.ndarray doesn' t 定义 __round__ 方法”