周期的な間隔よりも実行に時間がかかることを定期的に行う方法をアドバイスしてください。 例えばpython:定期的なノンブロッキング検索を行う方法
:
def lookup():
# do some lookups, retrieve info, let's assume it takes 60sec to complete
msg = {'abc':123}
time.sleep(60)
return msg
class Publisher(object):
def __init__(self):
self._TIMEIT = 0
self._INTERVAL = 5
self._counter = 0
def xxx():
t_start = time.time()
msg = lookup()
# do something with the value returned
save_msg_to_db(msg)
self._counter += 1
t_end = time.time()
self._TIMEIT = int(math.ceil(t_end - t_start))
def run():
while True:
# let's do the lookup every 5sec, but remember that lookup takes 60sec to complete
time.sleep(self._INTERVAL)
# the call to xxx() should be non-blocking
xxx()
しかしrun
方法は、定期的なタスク、 をスケジュールするための責任であり、それは反復処理としての機能xxx
を呼び出すときに、それがブロックしてはいけません。
私はA Bad Coroutine Exampleで説明したように、xxx
関数にすべての呼び出しでイベントループを作成するために考えていますが、どのようxxx
ノンブロッキングへの呼び出しを行うには?
PS。私はasyncio(以前はgeventを使用していた)にPython3.4を新しく使用していますが、ここではstupidと頼んでいるかどうかはわかりません。
したがってlookup
は、完了までに60秒かかると思われる非同期ループを作成します。しかし、run
メソッドでは、無限ループが実行されているので、5秒ごとにルックアップを実行したいと思っています。つまり、(1)どのくらい頻繁にルックアップ関数を呼び出しますか。(2)長いそれは(コードが簡潔にするために短縮)あなたのlookup()
は主にI/Oを集約的であるので、あなたがスレッドとしてごxxx()
方法を実行して、完全に罰金することができ
は、あなたの 'のルックアップです() '関数はCPUを多用するか、I/O操作のために完了するのに時間がかかりますか? – zwer
: "I/O操作のために完了するのに時間がかかります" – iamsterdam
'lookup()が実行されている間はどうなりますか?あなたがバックグラウンドで(ノンブロッキングで)実行したい場合は、完了までに60秒かかり、5秒ごとに呼び出すとかなりすぐに、何千もの実行されます。つまり、あなたのチェック間隔(それを拡張する)か 'lookup()'関数の呼び出し(前の呼び出しが完了しなかった場合に別の呼び出しをしないでください)があります。 – zwer