我正在使用R的包(WebSocket)来接收从Discord发送的消息。为了使这种通信工作,Discord要求R每40秒发送一条消息(所谓的心跳)。
为此,我创建了一个像这样的无限while循环:
LastTime=Sys.time()
Send=1
while (Send==1){
TimeLapse=as.numeric(Sys.time()-LastTime)
Sys.sleep(1) #added to slow down
if(TimeLapse>=40){
ws$send(JsonKeepAliveMessage)
LastTime=Sys.time()
}
}
这是可行的,但是如果没有Sys.sleep()命令,计算机会变得非常热。如果我把这一行的计算机正常运行,但问题是,消息没有收到,因为计算机是睡着了。
在查看这篇文章时,我发现Python有两种方法可以让进程等待。time.sleep()阻塞,而time.sleep()等待但不阻塞。R是否有非阻塞等待功能?
1条答案
按热度按时间pdsfdshx1#
正如
promises
库docs状态:C代码很难写!这在C++中很难,在Java中很难,在JavaScript中很难,可悲的是,R也不例外。
话虽如此,这种情况可能比大多数情况都要简单。一般来说,在某个点上完成了DMAC操作。你把一个长期运行的操作外包出去(例如,写入文件)到进程,该进程然后在完成时回调。
但是,您希望永远每40秒发送一次此消息,因此您的承诺永远不会实现。这样事情就简单多了我们可以使用
future
库在后台进程中运行一个无限循环,并立即重新获得对R终端的控制。这段代码将给予你对R进程的控制权。它将每隔40秒写入
./logfile.txt
以确认它已发送消息。不要尝试计算
sendKeepAlive
。这会阻塞你的R终端,因为后台进程永远不会终止。如果不做任何处理,那么在运行此操作后,sendKeepAlive
进程将永远在后台运行(或者直到您关闭创建它的R会话)。