2016-05-12 12 views
0

Pythonオブジェクトのメソッドとして(直接的に)実装されたときに完全に(無限ループで)動作するPyPyコールバック、Pythonを移動すると約100回繰り返した後のsegfaultsオブジェクトを別のマルチプロセッシングプロセスに変換します。私は、メインコードで〜100回の繰り返し後にCFFI segfaultsからのコールバック

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

ソリューション

ハンドル 's' は 'register_callback()' からの復帰時ガベージコレクションです。ハンドルを「自己」の属性にして、それを生き続ける。

標準CPython(cffi 1.6.0)は、最初の繰り返しでsegfaultされました(つまり、gcは即時でした)、私に重要な情報メッセージが表示されました。一方、PyPyはメッセージを出さずにおよそ100回繰り返した後にsegfaultを起こしました。

関連する問題