2016-05-12 2 views
0

Обратный вызов PyPy, который отлично работает (в бесконечном цикле) при реализации (прямо) как метод объекта Python, segfaults после примерно 100 итераций при перемещении Python объект в отдельный процесс многопроцессорности.Обратный вызов из «многопроцессорной обработки» с помощью CFFI segfaults после ~ 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 

Идея заключается в том, что несколько задач должны служить равное количество обратных вызовов одновременно. Я не знаю, что может вызвать segfault, тем более, что он работает отлично для первых ~ 100 итераций или около того. Помогите оценить!

ответ

0

Решение

Handle 's' является сбор мусора при возврате из 'register_callback()'. Создание дескриптора атрибута «я» и прохождение сохраняет его в живых.

Стандартная CPython (cffi 1.6.0), сглаженная при первой итерации (т. Е. Gc была немедленной) и предоставила мне важное информативное сообщение об ошибке. PyPy с другой стороны segfaulted после примерно 100 итераций без предоставления сообщения ... Оба теперь работают нормально.