这个问题与我以前的问题(Safe writing to variable in cython c wrapper within two python processes or distinct memory for python processes)
有关我具有从collections.deque继承的自定义类,并具有其他一些逻辑:
from collections import deque
from threading import Lock
class DequeWithLock(deque):
def __init__(self, iterable=(), maxlen=None):
super().__init__(iterable, maxlen)
self.lock = Lock()
def safe_append(self, data):
try:
self.lock.acquire()
self.append(data)
finally:
self.lock.release()
我也有某种名为“ SubscriptionClass
”的“主要” cdef类。奇怪的是,如果我按如下所示编写此类,则一切正常:
from dxpyfeed.wrapper.utils.data_class import DequeWithLock as deque
cdef class SubscriptionClass:
cdef dict data
def __init__(self):
self.data = dict()
self.data['data'] = deque()
此代码按预期工作,甚至Lock()也按预期工作。但是,我想摆脱不必要的dict定义,因此我通过以下方式重写代码:
cdef class SubscriptionClass:
cdef object data
def __init__(self):
self.data = deque()
但是,每次在另一个线程中启动的Cython函数尝试使用SubscriptionClass.data
并且没有任何元素附加到双端队列时,都会向我抛出一条消息。消息:Exception ignored in: 'path.to.cython.function'
。
我还尝试从(Mixing cdef and regular python attributes in cdef class)中添加cdef dict __dict__
,但这使我死定了。