具有数据库连接的foreach永久冻结,没有错误

Bra*_*sen 1 parallel-processing foreach r doparallel

library(doParallel)
library(RMySQL)

no_cores <- as.integer(system('getconf _NPROCESSORS_ONLN', intern = TRUE)) - 1
cluster <- makeCluster(no_cores)
registerDoParallel(cl)

clusterEvalQ(
  cluster, 
  mysql <- RMySQL::dbConnect(...)
  }
)

r <- foreach(i = 1:50, .verbose = TRUE) %dopar% { dbGetQuery(mysql, 'show tables;')}

no variables are automatically exported
Run Code Online (Sandbox Code Playgroud)

没有错误,没有抱怨。没事,它只是冻结。我可以启动和使用没有数据库连接的群集。

有什么想法吗?

Ste*_*ton 5

什么时候挂起?何时调用clusterEvalQ或foreach循环?

我有一些建议:

  • 使用outfile=""在创建群集时得到调试输出;
  • RMySQL初始化集群时加载;
  • 返回NULLclusterEvalQ以避免序列化连接对象;
  • 确保致电,registerDoParallel以便不在本地执行任务。

这是使用这些建议的测试:

library(doParallel)
cl <- makePSOCKcluster(3, outfile="")
registerDoParallel(cl)

clusterEvalQ(cl, {
  library(RMySQL)
  mysql <- dbConnect(MySQL(), user='root',
                     password='notmypasswd', dbname='mysql')
  NULL
})

r <-
  foreach(i=1:50, .verbose=TRUE) %dopar% {
    dbGetQuery(mysql, 'show tables;')
  }
Run Code Online (Sandbox Code Playgroud)

此测试对我有用。当我运行它时,我看到如下消息:

no variables are automatically exported
numValues: 50, numResults: 0, stopped: TRUE
got results for task 1
numValues: 50, numResults: 1, stopped: TRUE
returning status FALSE
got results for task 2
Run Code Online (Sandbox Code Playgroud)

如果仅看到:

no variables are automatically exported
Run Code Online (Sandbox Code Playgroud)

然后挂起,然后工作人员可能挂起,尝试使用数据库连接执行查询。在我看来,这听起来像是MySQL的问题,但我不是MySQL专家。