2016-03-23 16 views
0

私は非同期プログラムを実行している、と私は起動するすべてのスレッドが、私はそれが機能を完了しなかった場合、それがちょうど意志、タイムアウトを持つようにそれをマルチスレッド - のpython 2.7

をしたいと思います今、私は新しいスレッドを開始するに保つためにメインスレッドをしたいが、そのスレッドが勝ったので、私はまた、すべてのスレッドがそれにタイムアウトを持ちたい停止し、自分自身を殺す(またはいくつかの他のスレッドがそれを殺す)

func(my_item, num1, num2, num3, timeout): 
    calc = num1+num2 
    # something that takes long time(on my_item) 

for item in my_list: 
     if item.bool: 
      new_thread = threading.Thread(target=func, (item, 1, 2, 3, item.timeout)) 
      new_thread.start() 

永遠に続かない。

私がいないUNIXのウィンドウを使用していますので、私はSINGLRM

サンキュー実行することはできません!

答えて

1

スレッドを強制終了することは悪いことですが、スレッドを突然終了させる外部要因とは対照的に、長期実行機能が状態フラグをチェックして終了する方が良い方法です。シンプルなtime.time(と関数呼び出しの開始時間を記録し、チェック)と、すなわち、間隔を置いてその比較:

def func(x, y, timeout): 
    start = time.time() 
    while time.time() < (start + timeout): 
     # Do stuff 

または関数が例外を発生させます間隔で呼び出すことができるメソッドを追加タイムアウトがあなたの長時間実行されている機能は、クリーンアップし、スレッドを終了するには、try/exceptブロックでキャッチすることができますことを超えている:

def check_timeout(start_time, timeout): 
    if time.time() > (start_time + timeout): 
     raise TimeoutException 

try: 
    # Stuff 
    check_timeout(start_time, timeout) 
    # Bit more stuff 
    check_timeout(start_time, timeout) 
    # Bit more stuff 
    check_timeout(start_time, timeout) 
    # Bit more stuff 
    # All done! 
    return "everything is awesome" 

except TimeoutException: 
    # Cleanup and let thread end 

私は良い読み取り、このスレッドをお勧めします:Is there any way to kill a Thread in Python?

+0

それが問題です。なぜなら、私は自分のfuncの中でcmdコマンドを実行するサブプロセスを実行しており、それは長い時間を要するからです。時間内にサブプロキシを制限することはできますか? – Mumfordwiz

+0

あなたのPythonコードはコマンドラインから別のプログラムを実行していますか? – J2C

+0

これはあなたを助けるかもしれません:http://stackoverflow.com/questions/16866602/kill-a-running-subprocess-call – J2C