2017-10-20 11 views
1

関数を実行するのにT秒未満がかかる場合にのみ、関数fooを実行して戻り値を取得したい。さもなければ私は答えとしてNoneを取る。python:タイムアウトのある関数を実行して戻り値を取得する

この必要性を生み出した具体的な使用例は、しばしばハングする一連のsympy非線形ソルバーを実行することです。 sympyのヘルプを検索する際、devsはsympyでそれをやろうとは勧めませんでした。しかし、私はこの問題を解決する役に立つ実装を見つけることができませんでした。

答えて

0

これは私がやったことです。あなたがより良い解決策を持っているなら、共有してください!

import threading 
import time 

# my function that I want to run with a timeout 
def foo(val1, val2): 
    time.sleep(5) 
    return val1+val2 

class RunWithTimeout(object): 
    def __init__(self, function, args): 
     self.function = function 
     self.args = args 
     self.answer = None 

    def worker(self): 
     self.answer = self.function(*self.args) 

    def run(self, timeout): 
     thread = threading.Thread(target=self.worker) 
     thread.start() 
     thread.join(timeout) 
     return self.answer 

# this takes about 5 seconds to run before printing the answer (8) 
n = RunWithTimeout(foo, (5,3)) 
print n.run(10) 

# this takes about 1 second to run before yielding None 
n = RunWithTimeout(foo, (5,3)) 
print n.run(1) 
+0

whileループの代わりに 'thread.join(timeout)'だけではないのはなぜですか? –

+0

タイムアウトが10秒に設定されていても、関数が1秒で終了した場合、whileループがなければ、9秒間不必要に待機することになると思います。このようにして、少し速く結果を得ることができます。私が間違っていると私を訂正してください。 – florisvb

+0

これは間違っています、 'thread.join()'はタイムアウトまたは 'thread'が死ぬとすぐに戻ります。 –

関連する問題