[Rd] best practice for packages using mclapply to avoid tcltk
Simon Urbanek
simon.urbanek at r-project.org
Sun Feb 3 20:34:09 CET 2013
As Peter pointed out earlier, this is better addressed by disabling the Tcl/Tk event loop in forked processes.
Cheers,
Simon
On Feb 2, 2013, at 5:02 PM, Paul Johnson wrote:
> Dear R-devel friends:
>
> I'm back to bother you again about the conflict between mclapply and
> tcltk. I've been
> monitoring several packages that want to use mclapply to parallelize
> computations and
> need to figure out what should be done.
>
> It appears tcltk cannot be safely unloaded, so the best we can do is
> check for the presence of tcltk and stop if it is found before
> mclapply() is used.
>
> I wish you would please review my suggestion below. Maybe checkForTcltk()
> could be used in the parallel package. Otherwise, we are letting
> people run with scissors.
>
> There's a warning about this in ?mclapply
>
> It is _strongly discouraged_ to use these functions in GUI or
> embedded environments, because it leads to several processes
> sharing the same GUI which will likely cause chaos (and possibly
> crashes). Child processes should never use on-screen graphics
> devices.(Warning in ?mclapply)
>
> Bug report: (https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15040 )
>
> By the way, what is "embedded environments" in ?mclapply
>
> ## I don't want to crash your system, but if you want to see a freeze-up:
> ## change 0 to 1 and run this:
> if (0){
> library(parallel)
> library(tcltk)
> example(mclapply)
> }
>
> ## What are packagers supposed to do if they want to call mclapply?
> ## It appears to me the best a package can do is scan for tcltk and
> ## stop. Here's a function that does so.
>
> checkForTcltk <- function(){
> if ("tcltk" %in% loadedNamespaces()){
> stop("This function cannot be used because the R tcltk
> package is loaded. It is necessary to Close R, and re-run
> the program making sure that tcltk is never loaded before
> this function is called.")
> }
> }
>
> ## put that to use.
> MCLApply <- function(){
> if (!require(parallel)) stop ("parallel wouldn't load")
> checkForTcltk()
> example(mclapply)
> }
>
> ## test that:
>
> checkForTcltk()
> MCLApply()
>
> library(tcltk)
> checkForTcltk()
>
>
> ## Why can't tcltk just be unloaded? I don't understand, but it is a deep
> ## problem.
>
> ## Consider the ominous warnings in R detach's help:
> ##
> ## "Unloading some namespaces has undesirable side effects: e.g.
> ## unloading ‘grid’ closes all graphics devices, and on most systems
> ## ‘tcltk’ cannot be reloaded once it has been unloaded and may crash
> ## R if this is attempted." (Note: section of ?detach).
> ##
> ## To be fair, that does not say unloading tcltk is fatal, but
> ## reloading it is fatal. And I've seen plenty of times when
> ## unloading it is fatal.
>
> ## Example 1. Crash on library.dynam.unload()
> detach("package:tcltk", unload = TRUE)
> library.dynam.unload("tcltk", system.file(package = "tcltk"))
>
> ## Output
> ## > library.dynam.unload("tcltk", system.file(package = "tcltk"))
> ## >
> ## *** caught segfault ***
> ## address 0x7f69c9d99580, cause 'memory not mapped'
>
> ## Possible actions:
> ## 1: abort (with core dump, if enabled)
> ## 2: normal R exit
> ## 3: exit R without saving workspace
> ## 4: exit R saving workspace
> ## Selection:
> ## Process R segmentation fault at Sat Feb 2 13:55:08 2013
>
>
> ## Example 2.
> library(tcltk)
> detach("package:tcltk", unload = TRUE)
> library.dynam.unload("tcltk", system.file(package = "tcltk"))
> example(mclapply)
>
> ## Output:
>
> ## > example(mclapply)
>
> ## *** caught segfault ***
> ## address 0x7f25ccbfe000, cause 'memory not mapped'
>
> ## Possible actions:
> ## 1: abort (with core dump, if enabled)
> ## 2: normal R exit
> ## 3: exit R without saving workspace
> ## 4: exit R saving workspace
> ## Selection:
>
>
> pj
>
> --
> Paul E. Johnson
> Professor, Political Science Assoc. Director
> 1541 Lilac Lane, Room 504 Center for Research Methods
> University of Kansas University of Kansas
> http://pj.freefaculty.org http://quant.ku.edu
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
More information about the R-devel
mailing list