Julia有没有一种有效的方法可以将程序的执行暂停到第二天



假设我正在运行一个程序,每天我都想在X次迭代后暂停该程序,直到下一个日历日开始。程序每天必须暂停的时间会有所不同,因为我不知道某一天什么时候会完成X次迭代。

问题有没有一种简单的方法可以暂停程序,以便在第二天E.S.T开始时重新启动?

我想过使用sleep((函数。问题是程序每天必须暂停的时间间隔不同,所以我不能输入绝对时间值。所以我认为从概念上讲,这样的东西可能会起作用。

while true 
# run function until X loops
# sleep(Minute(tomorrow's date - now())

但我不确定我将如何从Julia那里开始明天的约会,也不确定这是否是最有效的方法。

任何想法都将不胜感激。谢谢

您通常会像@pfizzeb所说的那样使用cron。然而,最简单的漂亮Julia代码可能是:

function once_a_time(f, interval)
repeat = Ref(true) 
task = @async begin 
sleep(5) # some calculated time to start
while repeat[]
@async f()
sleep(interval)
end
end
return (;task, repeat)
end

该函数将在给定的固定时间间隔内执行f,而与之前的假设无关。此代码使用绿色线程,因此它假设f的执行时间小于interval的值(或者f主要是I/O(。该函数返回任务的句柄以及对repeat变量的引用,以便您可以从外部代码停止调度程序。

现在让我们测试一下:

julia> task, rep = once_a_time(()->println("hello ",round(Int,time()) % 1000), 5)
(task = Task (runnable) @0x000000001b69b850, repeat = Base.RefValue{Bool}(true))
julia> hello 347
hello 352
hello 357
hello 362
julia> rep[]=false
false

一般来说,我建议使用一些操作系统级别的调度器(如cron(,而不是长时间运行的进程,但你可以很容易地计算出你的程序需要使用睡眠的时间

julia> DateTime(today()) + Day(1) - now()
52522991 milliseconds

相关内容

  • 没有找到相关文章

最新更新