在约100次迭代后,使用CFFI段错误从“多处理”回调

时间:2016-05-12 15:51:32

标签: python-cffi

PyPy回调,当作为Python对象的方法实现(直接)时,它完美地工作(在无限循环中),当我将Python对象移动到单独的多处理过程中时,在大约100次迭代之后发生段错误。

在我的主要代码中:

import multiprocessing as mp

class Task(object):

    def __init__(self, com, lib):

        self.com = com # communication queue
        self.lib = lib # ffi library
        self.proc = mp.Process(target=self.spawn, args=(self.com,))
        self.register_callback()

    def spawn(self, com):
        print('%s spawned.'%self.name)
        # loop (keeping 'self' alive) until BREAK:
        while True:
            cmd = com.get()
            if cmd == self.BREAK:
                break
        print("%s stopped."%self.name)

    @ffi.calback("int(void*, Data*"):   # old cffi (ABI mode)
    def callback(self, data):
        # <work on data>
        return 1

    def register_callback(self):
        s = ffi.new_handle(self)
        self.lib.register_callback(s, self.callback)  # C-call

这个想法是多个任务应该同时服务于相同数量的回调。我不知道可能导致段错误的原因,特别是因为它在前100次左右的迭代中运行良好。非常感谢!

1 个答案:

答案 0 :(得分:0)

<强>解决方案

处理&#39;从&#39; register_callback()&#39;返回时收集垃圾。使句柄属于“自我”的属性。并且通过使它保持活力。

标准CPython(cffi 1.6.0)在第一次迭代时被分段(即gc是立即的),并为我提供了一个至关重要的信息性错误消息。另一方面,PyPy在大约100次迭代后进行了分段而没有提供消息......现在两者都运行良好。