2015-05-03 56 views
1

是否有可能在Ruby中执行本地计时器?是否有可能在Ruby中执行本地计时器?

即命令,然后在X时间之后的另一命令。

+0

当然 - '命令1;睡5次; command2'。 – Amadan

+0

我想要一个定时器不睡觉,睡眠会停止剩余的代码。 – Jack

+0

如果你的需求是松散的写的,你不会说什么,你没有说任何关于非阻塞或异步性的东西。 '命令1; Thread.new {sleep 5; command2}' – Amadan

回答

2

正如@Amadan所建议的那样,您可以为延迟任务创建一个新线程。

...但是,请注意,如果您的主线程退出(如果您的应用程序已完成),任务将不会执行。

在这种情况下,您可能需要在退出主代码之前调用Thread#join

在下面的脚本,线程来得及完成前主脚本完成 - 这个词“再见”永远不会被打印:根据您的应用和设计

Thread.new {puts 'hi!'; sleep 5; puts 'bye'} 

,你可能想将应用程序的执行移动到子线程,或者编写一个事件反应器来异步运行所有内容。

这样,即使应用程序在任务完成之前完成,也可以确保该任务运行。

例如,假设您的代码需要2秒就可以完成一个任务,并打印出输出:

app_thread = Thread.new do 
    sleep 2 
    puts "app is done!" 
end 

,你的任务需要5秒:

task_thread = Thread.new {sleep 5; puts 'task is done.'} 

你可以确保过程在完成任务和应用程序之前不退出:

app_thread.join 
task_thread.join 

试试看fo llowing演示代码使用和不使用join报表,看看会发生什么脚本:

app_thread = Thread.new do 
    sleep 2 
    puts "app is done!" 
end 

task_thread = Thread.new {sleep 5; puts 'task is done.'} 

app_thread.join 
task_thread.join 

如果你正在寻找到事件反应器和定时器,可以观察到EventMachine code或 - 如果你正在寻找一个纯红宝石例如,可以挖成还支持定时器在一定程度上Plezi framework's code(使用run_everyrun_after方法here,尽管它们是基于离event's managementreactor

相关问题