并发队列的循环垃圾收集Python C扩展

问题描述

我试图用Python将C中的并发队列实现包装起来。它有两种方法

在内部链接列表中,每个节点都包含一个指向存储对象的指针,以及一个指向下一个节点的指针。每个操作都会激活两个互斥锁之一,以防止出现竞争情况(如果您好奇,它是Michael-Scott two-lock concurrent queue)。如前所述,我想使用此队列存储Python对象。

阅读cyclic garbage collection附带的Python官方文档,该文档通过Py_TPFLAGS_HAVE_GC标志启用。据我了解,任何作为其他类型(包括其他容器)容器的Python类型都必须支持它,而我的队列似乎属于此类。任何支持功能的类型都必须在其类型结构中使用自己的实现定义tp_traversetp_clear字段。对于普通的容器类型(like a list),tp_traverse函数将遍历所有包含的元素并在它们上调用Py_VISITtp_clear与之类似,但调用Py_XDECREF

我的问题:

  • 在遍历列表的所有元素以执行适当的调用之前,我应该锁定整个列表吗?执行垃圾收集时,此锁是否会影响性能或线程是否处于挂起状态?
  • 调用Py_XDECREF之后,是否应该从队列中完全删除元素?我的猜测是,我应该检查队列中每个ob_refcnt的{​​{1}}字段是否为零,这是正确的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)