51952


はじめまして．  
私は今pythonでプログラミングの勉強をしております．

タイトルのように，  
ある処理が一定時間で終了しなければ，次の処理に移るようなコードを作成したいと思っております．

[code]

    for value in values:
      # valueについて処理1
      # valueについて処理2
      # valueについて処理3
    
[/code]

この，valueについての処理が一定時間に終わらなければ再処理するにはどうしたらよいでしょうか？

できれば高精度で処理を中断したいので，valueについての処理中にも監視したいです．

そこで，スレッドを生成して監視すればよいかとも思ったのですが，処理が終了しているかどうかの監視や，再処理の仕方がわかりませんでした．

なにか解決方法ありましたら，教えてください．  
よろしくお願いいたします．


CC BY-SA 4.0
2019-01-13T07:55:42.663
51940
2019-01-14T13:10:12.867
2019-01-14T13:10:12.867
19110
31767
question
python
python 一定時間で処理が終了しなければ，次の処理に移るようなコード


まずは、こんな記事を見てください。  
[ごく簡単な Python multiprocessing の使い方](https://librabuch.jp/blog/2015/01/python-
multiprocessing/)

この中で使っている `join` という関数でパラメータを指定すれば、タイムアウトを検出できます。  
[join([timeout])](https://docs.python.org/ja/3.6/library/multiprocessing.html#multiprocessing.Process.join)

> オプションの引数 timeout が None (デフォルト) の場合、 join() メソッドが呼ばれたプロセスは処理が終了するまでブロックします。
> timeout が正の数である場合、最大 timeout 秒ブロックします。 プロセスが終了あるいはタイムアウトした場合、メソッドは None
> を返すことに注意してください。 プロセスの `exitcode` を確認し終了したかどうかを判断してください。
>
> 1つのプロセスは何回も join されることができます。
>
> プロセスは自分自身を join することはできません。それはデッドロックを引き起こすことがあるからです。プロセスが start される前に join
> しようとするとエラーが発生します。

時間が掛かっている、未終了の処理はどうするか、  
とか色々考えることは沢山ありますので、頑張ってください。

直接は関係ありませんが、こんな記事も参考にしてください。  
[マルチプロセスな処理を実装して、処理を高速化する](https://www.yoheim.net/blog.php?q=20170601)


CC BY-SA 4.0
2019-01-13T09:17:38.750
51947
2019-01-13T09:17:38.750
2020-06-17T08:14:45.997
-1
26370
51940
answer


やり方はいろいろあると思うのです。マルチプロセスでもマルチスレッドでも  
水車の再発明は避けたいので、ありもののライブラリを利用するのはいかがでしょうか。  
「タイムアウトさせたい処理」メソッドないしは関数で定義すれば、実現できそうですが。。。

<https://qiita.com/toshitanian/items/133b42355b7867f5c458>[](https://qiita.com/toshitanian/items/133b42355b7867f5c458)


CC BY-SA 4.0
2019-01-13T13:26:47.290
51952
2019-01-13T13:26:47.290
10174
51940
answer


今回，コメントにあったtimeout-decoratorを参考にさせて頂きました．  
再処理にはretryというパッケージで実現いたしました．  
何かの参考になりますと幸いです．

[code]

    import time
    import random
    from retry import retry
    from timeout_decorator import timeout, TimeoutError
    
    class Test():
    
        @retry(TimeoutError, tries=3, delay=1, backoff=2)
        @timeout(5)
        def worker(value):#valueの処理
            print (value),
            #1~10秒待つ.
            sleep_time = random.randrange(1, 10)
            print (":sleep_time", sleep_time)
            time.sleep(sleep_time)
            print(value, ":Done.")
    
        if __name__ == "__main__":
            values = [1, 2, 3]
    
            for value in values:
                Time = time.time()
                try:
                    worker(value)
                except TimeoutError as e:
                    print (e)
                finally:
                    print("掛った時間", time.time() - Time)
    
            print ("Finish")
    
[/code]


CC BY-SA 4.0
2019-01-14T13:07:52.860
51968
2019-01-14T13:07:52.860
31767
51940
answer