在 Julia 中是否有一种有效的方法可以将程序的执行暂停到第二天?
Is there a efficient way in Julia to pause execution of a program until the next day?
假设我是一个 运行 程序,每天我想在 X 次迭代后暂停该程序,直到下一个日历日开始。程序每天必须暂停的时间会有所不同,因为我不知道 X 次迭代将在给定的一天完成。
问题有没有简单的方法可以暂停程序,使其在第二天开始时重新启动E.S.T?
我想到了使用 sleep() 函数。问题是程序每天必须暂停的时间间隔不同,所以我不能输入绝对时间值。所以我在概念上认为这样的东西可能会起作用。
while true
# run function until X loops
# sleep(Minute(tomorrow's date - now())
但我不确定如何从 Julia 获取明天日期的开始时间,或者这是否是最有效的方法。
如有任何想法,我们将不胜感激。谢谢!
一般来说,我建议为此使用一些 OS 级别的调度程序(如 cron),而不是一个漫长的 运行 进程,但您可以轻松计算出您的程序需要休眠的时间与
julia> DateTime(today()) + Day(1) - now()
52522991 milliseconds
您通常会像@pfitzseb 所说的那样使用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)。
函数 returns 是任务的句柄以及对 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
假设我是一个 运行 程序,每天我想在 X 次迭代后暂停该程序,直到下一个日历日开始。程序每天必须暂停的时间会有所不同,因为我不知道 X 次迭代将在给定的一天完成。
问题有没有简单的方法可以暂停程序,使其在第二天开始时重新启动E.S.T?
我想到了使用 sleep() 函数。问题是程序每天必须暂停的时间间隔不同,所以我不能输入绝对时间值。所以我在概念上认为这样的东西可能会起作用。
while true
# run function until X loops
# sleep(Minute(tomorrow's date - now())
但我不确定如何从 Julia 获取明天日期的开始时间,或者这是否是最有效的方法。
如有任何想法,我们将不胜感激。谢谢!
一般来说,我建议为此使用一些 OS 级别的调度程序(如 cron),而不是一个漫长的 运行 进程,但您可以轻松计算出您的程序需要休眠的时间与
julia> DateTime(today()) + Day(1) - now()
52522991 milliseconds
您通常会像@pfitzseb 所说的那样使用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)。
函数 returns 是任务的句柄以及对 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