2017-01-19 4 views
-1

これについて議論するいくつかの質問がありましたが、私が持つ制約のセットはありません。誰かが良いアイデアを持ってくるかもしれません。Pythonのタイムアウト制御されていないオーバーライドされた関数

基本的に私はセットアップするためにPython関数のタイムアウトを以下の制約の下で必要:

  1. クロスプラットフォーム(すなわち無signal.ALARM)

  2. ないのPython 3(私ができますPython> = 2.7.9と仮定)

  3. 関数だけがタイムアウトする必要があります。プログラム全体を終了することはできません。

  4. 私は、呼び出された関数を全く制御できません。つまり、派生クラスとオーバーライドを使用して抽象インターフェイスを使用するコールバックです。他の人はこれらのコールバック関数を書いていて、彼らはばかだと仮定しています。

例コード:

class AbstractInterface(Object): 
    def Callback(self): 
     # This will be overridden by derived classes. 
     # Assume the implementation cannot be controlled or modified. 
     pass 

... 

def RunCallbacks(listofcallbacks): 
    # This is function I can control and modify 
    for cb in listofcallbacks: 
     # The following call should not be allowed to execute 
     # for more than X seconds. If it does, the callback should 
     # be terminated but not the entire iteration 
     cb.Callback() 

任意のアイデアを大幅に理解されるであろう。

答えて

0

他の人がこれらのコールバック関数を書いていると仮定して、それらがばかだと仮定しています。

「馬鹿」と思われる人からのコードを実行しないでください。

しかし、私は以下に示す1つの可能性を思いつきました(python3でのみテストされましたが、少し修正してpython2で動作するはずです)。

警告:これは、指定されたタイムアウト後に終了する新しいプロセスですべてのコールバックを実行します。

from multiprocessing import Process 
import time 

def callback(i): 
    while True: 
     print("I'm process {}.".format(i)) 
     time.sleep(1) 

if __name__ == '__main__': 
    for i in range(1, 11): 
     p = Process(target=callback, args=(i,)) 
     p.start() 
     time.sleep(2) # Timeout 
     p.terminate() 
+0

>あなたは「ばか」と思う人のコードを実際には実行しないでください。 これは実際には可能ではありません。私は、他の人がビルドするためのAPIを提供するフレームワークを作成しています。プラグインプラットフォームを使ってソフトウェアを書くのと同じです。プラグインを書く人が誰なのかわからないので、コーディング方法がわからないと思います。 とにかく - 私はforkについて考えました。プロセスのオーバーヘッドとPOSIX/Windowsの違い以外の主な問題は、複雑なIPCを使う必要があることです(私のコードで "self"ポインタ使用されている)。 – Dan

関連する問題