我目前正在开发一个涉及从多个进程和线程向队列复制对象和从队列复制对象的项目。我正在使用多处理模块中的队列,因为队列必须是线程安全的。但是,在分析我的代码之后,我发现我的程序中的瓶颈涉及使用put / get复制到队列和从队列复制。我试图使用来自rqueue的libhl和python ctypes,以期获得更好的性能。该队列旨在包含python元组,其中包含int和numpy数组的元组。但是,rqueue返回一个void指针,我不确定如何使用它。这是我一直在尝试的:
首先,我导入C库:
self.myQlib = ctypes.CDLL('rqueue.dll')
稍后,我尝试写入队列:
self.myQlib.rqueue_write(self.prediction_q, ctypes.py_object((self.id, state)))
这里predict_q是队列,id是int,state是numpy数组的元组。
最后,我尝试从队列中读取:
pop = self.myQlib.rqueue_read
pop.restype = ctypes.POINTER(ctypes.py_object)
addr = pop(self.prediction_q)
print("addr : " + repr(addr))
ids[size] = addr[0]
(x[size], ci, hi) = addr[1]
这会导致以下错误:
addr : <TestAgent.LP_py_object object at 0x7f688ff2ed90>
Process TestAgent-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/xxx/TestAgent.py", line 64, in run
_, _, c, h = self.predict((testImage, c, h))
File "/xxx/TestAgent.py", line 42, in predict
ids[size] = addr[0]
ValueError: PyObject is NULL
我不确定使用ctypes和我的特定用例是否可以实现我想要实现的目标。我非常欢迎任何帮助。