2017-10-26 11 views
2

関数のリスト(1..N)と関数iX_i秒ごとに呼び出す必要があります(X_iは1000+などのように大きくなります)。 X_iはそれぞれユニークである必要はありません。すなわち、可能なのはX_i == X_jです。ラウンドロビンスケジューラ - 定期的に適切な時刻に関数を呼び出す

私は(function_i、X_i)のリストを生成し、これらの関数を将来的に適切な時に実行し、呼び出し間でスリープする方法を教えてください。以前はApSchedulerを使用していましたが、並列にタスクを実行しており、次々に実行される関数が必要です。

実行する必要があり、次のブロックまでブロックする現在の関数を返す私自身のイテレータを書くことができますが、もし存在するならば、ライブラリを使いたいでしょうか?

EDIT:Nは現時点で約200です。

答えて

0

threadingモジュール

threadingモジュールを使用すると、他のスレッドのsleep文によって影響されない新しいスレッドを開始することができます。これにはNスレッドが必要です。したがって、Nが非常に大きい場合はお知らせください。代替ソリューションについて考えてみましょう。

あなたはNスレッドを作成し、タイミングループにそれぞれ1を設定し、そのようにすることができます

import threading, time 

def looper(function, delay): # Creates a function that will loop that function 
    def inner(): # Will keep looping once invoked 
     while True: 
      function() # Call the function; you can optionally add args 
      time.sleep(delay) # Swap this line and the one before it to wait before running rather than after 
    return inner # The function that should be called to start the loop is returned 

def start(functions, delays): # Call this with the two lists to start the loops 
    for function, delay in zip(functions, delays): # Goes through the respective pairs 
     thread = threading.Thread(target = looper(function, delay)) # This thread will start the looper 
     thread.start() 

start([lambda: print("hi"), lambda: print("bye")], [0.2, 0.3]) 

あなたは、オンラインhereそれを試すことができます。ちょうどあなたがそれを殺したいときに実行してから再度実行してください(オンライン通訳のための@DennisMitchellのおかげで)

+0

こんにちは、答えに感謝します。関数を並列に実行したくない理由は、各関数がデータをデータベースに挿入するからです。私は同時に挿入を処理すると思うSQLAlchemyを使用していますが、同時にこの複雑さを避けたいと思います。多分私はこれについて心配するべきではない。 – s5s

+0

@ s5s - これは競合状態に問題を引き起こす可能性があります。私は、並列を必要としないメソッドを作成しようとします – HyperNeutrino

+0

私は私の質問を更新しました。 Nは現在約200です。 – s5s

関連する問題