返回信息流因为是公司代码,而且整个结构比较复杂,所以不方便贴出来。
python3.5程序,使用asyncio,没有使用c扩展库。
运行时在这一行assertion failed了:
https://github.com/python/cpython/blob/master/Modules/gcmodule.c#L364
gdb进去看这个引用计数为0的对象(这么找:
https://github.com/python/cpython/blob/master/Modules/gcmodule.c#L34)是个asyncio.Task对象(https://docs.python.org/3/library/asyncio-task.html#asyncio.Task),简单看了下代码中使用ensure_future(https://docs.python.org/3/library/asyncio-task.html#asyncio.ensure_future)会弄出来这种东西,甚至复现出core的过程中有部分core能留下这个Task的函数名,但是没有什么更多的信息了,检查代码也感觉没有问题。
想请教下有没有朋友了解python35的gc为什么会出现这种诡异的问题。或者有没有用asyncio的朋友遇到过。
这是一条镜像帖。来源:北邮人论坛 / python / #12783同步于 2016/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[问题]python3.5 asyncio使用时SIGABRT
jffifa
2016/3/18镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
给Python报bug吧。
不管写多么错的Python程序,垃圾回收都不应该出错的。这对于任何有垃圾回收的语言来说都应如此。
顺便吐槽一下Python的“朴素引用计数”垃圾回收是很烂的,只比PHP和Perl略好一些。
至于错误的原因,我怀疑是虽然你们没有写C模块,但Python3.5的asyncio里面涉及了C模块,那里面没有妥善处理引用计数,但错误没有立即在C模块里引发,而是推迟到很久以后在Python的GC里出错。
【 在 nuanyangyang 的大作中提到: 】
: 给Python报bug吧。
: 不管写多么错的Python程序,垃圾回收都不应该出错的。这对于任何有垃圾回收的语言来说都应如此。
: 顺便吐槽一下Python的“朴素引用计数”垃圾回收是很烂的,只比PHP和Perl略好一些。
没有用,去年有人提过同样的issue,但是因为提不出具体的复现代码,bug被关闭了。
https://bugs.python.org/issue23187
【 在 nuanyangyang 的大作中提到: 】
: 这个容易重现吗?只在非常大的工程中才出现吗?
不太清楚,我们现在也在找个最小化的片段尝试能复现这个问题。
【 在 jffifa 的大作中提到: 】
:
: 不太清楚,我们现在也在找个最小化的片段尝试能复现这个问题。
好可怜
GC bug是最难调试的bug之一。我们实验室的人都同意。
另外,为什么选用Python呢?