我有一堆需要并行完成的计算。在该计算中,通过一个全局信道访问数据库。所以它是这样的:
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)
}