我在服务器端有一个R代码:
socket.reader <- function(host="localhost", port=6011, time_freq){
shell(paste("C:/Users/Stefan/source/repos/Quick-Check/Debug/Quick-Check.exe","COM3","127.0.0.1",port,time_freq))
con <- socketConnection("localhost", port,server=TRUE, open="r+")
txt <- readLines(con)
close(con)
return(txt)
}
observeEvent(input$socket_reader, {
input<-socket.reader(time_freq=input$Samp_Freq*60)
#tosave<-ts(as.numeric(input), frequency=200)
write.csv(input,"C:/Users/Stefan/Documents/app/data/samplerun")
})
应该启动套接字服务器,然后执行.exe并读入.exe发送给服务器的所有内容(exe来自于cpp测量某个设备)。 问题是,套接字连接在服务器端打开后,r进程似乎被阻塞,直到套接字再次被超时关闭,该进程才评估.exe。我尝试在服务器打开之前将.exe放入,并在.exe中放置了3秒的延迟,但是似乎.exe启动,出现延迟,继续评估r-server套接字连接,这再次产生了保持到超时。
有人知道如何从R中启动另一个进程,以便同时评估两个实例,或者在打开套接字连接时取消对R实例的持有吗? 祝福
答案 0 :(得分:1)
如果wait = FALSE
在您的系统上可用,则可以在启动套接字服务器时指定该选项:
system2("nc", "-l -p 6011 -c /bin/cat", wait = FALSE)
con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
server=FALSE, open="r+")
write_resp <- writeLines("Hello, world!", con)
server_resp <- readLines(con, 1)
print(paste("Server response: ", server_resp))
close(con)
或者,您可以使用future
软件包:
library(future)
plan(multiprocess)
server %<-% {
system2("nc", "-l -p 6011 -c /bin/cat")
}
con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
server=FALSE, open="r+")
write_resp <- writeLines("Hello, world!", con)
server_resp <- readLines(con, 1)
print(paste("Server response: ", server_resp))
close(con)
这里只有server
被声明为Future,而客户端代码是在父会话中执行的。
注意:nc
命令仅在端口6011
上打开一个简单的回显服务器。