【问题标题】:Callback from "multiprocessing" with CFFI segfaults after ~100 iterations大约 100 次迭代后,带有 CFFI 段错误的“多处理”回调
【发布时间】:2023-04-05 01:30:01
【问题描述】:

一个 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 次左右的迭代中运行良好。非常感谢您的帮助!

【问题讨论】:

    标签: python-cffi


    【解决方案1】:

    解决方案

    句柄“s”在从“register_callback()”返回时被垃圾回收。使句柄成为“自我”的属性并传递使其保持活力。

    标准 CPython (cffi 1.6.0) 在第一次迭代时出现段错误(即 gc 是即时的),并为我提供了一条重要的信息错误消息。另一方面,PyPy 在大约 100 次迭代后出现了段错误,但没有提供消息……现在两者都运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多