我有一堆需要并行完成的计算。在这个计算中,数据库是通过一个全局通道访问的。所以它是这样的:
library(doMC)
registerDoMC(2)
channel <<- connect_to_database()
results <- foreach(i=indexes) %dopar% {
data <- get_data_from_db(channel)
result <- do_computations(data)
}
但是他们我得到了这个错误:
task 1 failed - "cannot open the connection"
原因很可能是因为线程同时访问通道。有没有办法在 get_data_from_db 周围放置一个互斥锁?或者创建更多连接并在访问之前检查是否有免费连接?有什么建议么?
非常感谢!
---------------编辑-------------- 现在我正在为每个索引创建一个连接。但我现在收到此错误:
task 1 failed - "expired MySQLConnection"
library(doMC)
registerDoMC(2)
channel<<-list()
for(i=indexes){
channel[[i]] <-connect_to_database(...)
}
results <- foreach(i=indexes) %dopar% {
data <- get_data_from_db(channel[[ind]])
result <- do_computations(data)
}