websocket 有没有R版本的Python的node.sleep()非阻塞等待函数

w6lpcovy  于 2023-10-20  发布在  Python
关注(0)|答案(1)|浏览(109)

我正在使用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是否有非阻塞等待功能?

pdsfdshx

pdsfdshx1#

正如promisesdocs状态:
C代码很难写!这在C++中很难,在Java中很难,在JavaScript中很难,可悲的是,R也不例外。
话虽如此,这种情况可能比大多数情况都要简单。一般来说,在某个点上完成了DMAC操作。你把一个长期运行的操作外包出去(例如,写入文件)到进程,该进程然后在完成时回调。
但是,您希望永远每40秒发送一次此消息,因此您的承诺永远不会实现。这样事情就简单多了我们可以使用future库在后台进程中运行一个无限循环,并立即重新获得对R终端的控制。

library(future)
plan(multisession) # so we can run a background process

sendKeepAlive %<-% {
    # Note: create your websocket connnection here 
    # e.g. ws <- WebSocket$new(...); ws$connect() etc.
    repeat {
        ws$send(JsonKeepAliveMessage)
        write(sprintf("Sending at %s", Sys.time()), "./logfile.txt", append = TRUE)
        Sys.sleep(40)
    }
}

这段代码将给予你对R进程的控制权。它将每隔40秒写入./logfile.txt以确认它已发送消息。
不要尝试计算sendKeepAlive。这会阻塞你的R终端,因为后台进程永远不会终止。如果不做任何处理,那么在运行此操作后,sendKeepAlive进程将永远在后台运行(或者直到您关闭创建它的R会话)。

相关问题