根据python中的一段时间生成脚本的一些“随机”开始时间

时间:2016-03-30 02:09:05

标签: python python-2.7 datetime random random-seed

我正在尝试生成一些随机播种时间来告诉我的脚本何时从主脚本中触发每个脚本。

我想设定一个时间范围:

START_TIME = "02:00"
END_TIME = "03:00"

当它到达开始时间时,需要查看我们必须运行的脚本数量:

script1.do_proc()
script2.alter()
script3.noneex()

在这种情况下,有3个要运行,因此需要生成3个随机时间来启动这些脚本,每个脚本之间的最小间隔为5分钟,但时间必须在设置的时间内在START_TIMEEND_TIME

但是,它还需要知道script1.main始终是第一个触发的脚本,其他脚本可以随机播放(随机)

因此,我们可能会在01:43运行script1,然后在01:55运行script3,然后{02}运行{02}

我们也可能在01:35运行script2然后在01:45运行script1然后{01}运行01:45这也可以。

到目前为止我的脚本可以在下面找到:

script3

编辑31/03/2016

假设我添加以下内容

script2
  • 我们现在有要运行的脚本数
  • 我们有要运行的脚本列表。
  • 我们有主脚本的名称,首先运行的脚本。
  • 我们有时间在几秒钟内显示总共运行所有脚本的时间。

当然有一种方法我们可以插入某种循环来实现它。

  • import random import pytz from time import sleep from datetime import datetime import script1 import script2 import script3 START_TIME = "01:21" END_TIME = "03:00" while 1: try: # Set current time & dates for GMT, London CURRENT_GMTTIME = datetime.now(pytz.timezone('Europe/London')).strftime("%H%M") CURRENT_GMTDAY = datetime.now(pytz.timezone('Europe/London')).strftime("%d%m%Y") sleep(5) # Grab old day for comparisons try: with open("DATECHECK.txt", 'rb') as DATECHECK: OLD_DAY = DATECHECK.read() except IOError: with open("DATECHECK.txt", 'wb') as DATECHECK: DATECHECK.write("0") OLD_DAY = 0 # Check for new day, if it's a new day do more if int(CURRENT_GMTDAY) != int(OLD_DAY): print "New Day" # Check that we are in the correct period of time to start running if int(CURRENT_GMTTIME) <= int(START_TIME.replace(":", "")) and int(CURRENT_GMTTIME) >= int(END_TIME.replace(":", "")): print "Correct time, starting" # Unsure how to seed the start times for the scripts below script1.do_proc() script2.alter() script3.noneex() # Unsure how to seed the start times for above # Save the current day to prevent it from running again today. with open("DATECHECK.txt", 'wb') as DATECHECK: DATECHECK.write(CURRENT_GMTDAY) print "Completed" else: pass else: pass except Exception: print "Error..." sleep(60) ,这是3次
  • 生成3粒种子,确保最短时间为SCRIPTS = ["script1.test()", "script2.test()", "script3.test()"] MAIN_SCRIPT = "script1.test()" TIME_DIFFERENCE = datetime.strptime(END_TIME, "%H:%M") - datetime.strptime(START_TIME, "%H:%M") TIME_DIFFERENCE = TIME_DIFFERENCE.seconds ,所有3粒种子不得超过for i in range(len(SCRIPTS))
  • 根据300然后TIME_DIFFERENCE
  • 创建开始时间
  • 第一个循环会检查RUN_TIME = START_TIME中是否存在RUN_TIME = RUN_TIME + SEED[i],如果确实存在,那么它会首先运行该脚本,从MAIN_SCRIPT删除自己,然后在下一个循环中删除,因为它不会不存在于SCRIPTS中,它会切换到随机调用其他脚本之一。

播种次数

以下似乎有效,但可能有一种更简单的方法。

SCRIPTS

2 个答案:

答案 0 :(得分:1)

使用datetime.timedelta计算时差。此代码假定所有三个进程在同一天运行

from datetime import datetime, timedelta
from random import randint

YR, MO, DY = 2016, 3, 30
START_TIME = datetime( YR, MO, DY, 1, 21, 00 )   # "01:21"
END_TIME = datetime( YR, MO, DY, 3, 0, 0 )       # "3:00"
duration_all = (END_TIME - START_TIME).seconds
d1 = ( duration_all - 600 ) // 3          
#       
rnd1 = randint(0,d1)
rnd2 = rnd1 + 300 + randint(0,d1)
rnd3 = rnd2 + 300 + randint(0,d1)
#      
time1 = START_TIME + timedelta(seconds=rnd1)
time2 = START_TIME + timedelta(seconds=rnd2)
time3 = START_TIME + timedelta(seconds=rnd3)
#
print (time1)
print (time2)
print (time3)

rnd1rnd2rnd3的值相隔至少5分钟(300秒)。

rnd3的值不能大于总时间间隔(3 * d1 + 600)。所以这三次都发生在区间内。

注意:您没有指定每个脚本运行的时间。这就是我没有使用time.sleep的原因。可能的选项是threading.Timer(参见python文档)。

答案 1 :(得分:1)

假设您将所有method.func()存储在一个数组中,正如您所描述的,后续脚本必须在script1之后至少5分钟。它们可以随机执行,因此我们可以启动多个进程并让它们在自动启动之前休眠一段时间。 (时间以秒为单位)

from multiprocessing import Process
import os
import random
import time
#store all scripts you want to execute here
eval_scripts = ["script1.test()","script2.test()", "script3.test()"]

#run job on different processes. non-blocking
def run_job(eval_string,time_sleep):
    #print out script + time to test
    print eval_string + " " + str(time_sleep)
    time.sleep(time_sleep) #wait to be executed
    #time to start
    eval(eval_string)


def do_my_jobs():
    start_time = []
    #assume the duration between start_time and end_time is 60 mins, leave some time for other jobs after the first job (5-10 mins). This is just to be careful in case random.randrange returns the largest number
    #adjust this according to the duration between start_time and end_time since calculating (end_time - star_time) is trivial.
    proc1_start_time = random.randrange(60*60 - 10*60)
    start_time.append(proc1_start_time)
    #randomize timing for other procs != first script
    for i in range(len(eval_scripts)-1):
            #randomize time from (proc1_start_time + 5 mins) to (end_time - star_time)
            start_time.append(random.randint(proc1_start_time+5*60, 60*60))

    for i in range(len(eval_scripts)):
            p_t = Process(target = run_job, args = (eval_scripts[i],start_time[i],))
            p_t.start()
            p_t.join()

现在你需要做的就是每天只在START_TIME打电话给do_my_jobs()。