2016-05-12 5 views
0

Ein PyPy-Callback, der perfekt funktioniert (in einer Endlosschleife), wenn er (einfach) als Methode eines Python-Objekts implementiert wird, segelt nach ungefähr 100 Iterationen, wenn ich Python verschiebe Objekt in einen separaten Multiprocessing-Prozess.Callback von "multiprocessing" mit CFFI segfaults nach ~ 100 Iterationen

Im Haupt Code ich habe:

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 

Die Idee ist, dass mehrere Aufgaben gleichzeitig eine gleiche Anzahl von Callbacks dienen sollten. Ich habe keine Ahnung, was den Segfault verursachen könnte, zumal es für die ersten ~ 100 Iterationen gut läuft. Hilfe sehr geschätzt!

Antwort

0

Lösung

Handle 's' ist, wenn sie von Müll gesammelt 'register_callback()' zurückkehrt. Den Griff zu einem Attribut von 'Selbst' zu machen und ihn zu überschreiten, hält ihn am Leben.

Standard CPython (cffi 1.6.0) segfaulted bei der ersten Iteration (d. H. GC war sofort) und lieferte mir eine entscheidende informative Fehlermeldung. PyPy andererseits segfaulted nach ungefähr 100 Iterationen, ohne eine Nachricht zur Verfügung zu stellen ... Beide laufen gut jetzt.

Verwandte Themen