1秒間に指定した回数ステートメントを実行するコードを書きたい.
ここでは、レートを毎秒30にしたい
関数を 1 秒あたり 30 回 60 秒間実行したい場合は、速度 = 30/秒、持続時間 = 60 秒を意味します
同じことをするためにPythonで利用できるAPIは誰でも教えてもらえますか?
1秒間に指定した回数ステートメントを実行するコードを書きたい.
ここでは、レートを毎秒30にしたい
関数を 1 秒あたり 30 回 60 秒間実行したい場合は、速度 = 30/秒、持続時間 = 60 秒を意味します
同じことをするためにPythonで利用できるAPIは誰でも教えてもらえますか?
sched
モジュールはまさにこれを目的としています:
from __future__ import division
import sched
import time
scheduler = sched.scheduler(time.time, time.sleep)
def schedule_it(frequency, duration, callable, *args):
no_of_events = int( duration / frequency )
priority = 1 # not used, lets you assign execution order to events scheduled for the same time
for i in xrange( no_of_events ):
delay = i * frequency
scheduler.enter( delay, priority, callable, args)
def printer(x):
print x
# execute printer 30 times a second for 60 seconds
schedule_it(1/30, 60, printer, 'hello')
scheduler.run()
スレッド化された環境では、 の使用を次のsched.scheduler
ように置き換えることができますthreading.Timer
。
from __future__ import division
import time
import threading
def schedule_it(frequency, duration, callable, *args, **kwargs):
no_of_events = int( duration / frequency )
for i in xrange( no_of_events ):
delay = i * frequency
threading.Timer(delay, callable, args=args, kwargs=kwargs).start()
def printer(x):
print x
schedule_it(5, 10, printer, 'hello')
あなたが望むことをするために使用time.time()
することができます:
import time
def your_function():
# do something...
while True:
start = time.time() # gives current time in seconds since Jan 1, 1970 (in Unix)
your_function()
while True:
current_time = time.time()
if current_time - start >= 1.0/30.0:
break
これにより、実行に時間がかかるyour_function
場合でも、の呼び出し間の遅延が1/30 秒に非常に近くなります。your_function
もう 1 つの方法があります。Python の組み込みスケジューリング モジュールsched
. 使ったことがないので参考にはなりませんが、参考にしてください。
使ってみてくださいthreading.Timer
:
def hello():
print "hello, world"
t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
しばらく費やした後、それをうまく行う方法を発見しました。Pythonでマルチプロセッシングを使用してそれを達成しました。これが私の解決策です
#!/usr/bin/env python
from multiprocessing import Process
import os
import time
import datetime
def sleeper(name, seconds):
time.sleep(seconds)
print "PNAME:- %s"%name
if __name__ == '__main__':
pros={}
processes=[]
i=0
time2=0
time1=datetime.datetime.now()
for sec in range(5):
flag=0
while flag!=1:
time2=datetime.datetime.now()
if (time2-time1).seconds==1:
time1=time2
flag=1
print "Executing Per second"
for no in range(5):
i+=1
pros[i] = Process(target=sleeper, args=("Thread-%d"%i, 1))
j=i-5
for no in range(5):
j+=1
pros[j].start()
j=i-5
for no in range(5):
j+=1
processes.append(pros[j])
for p in processes:
p.join()