1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
library(progressr)
library(future)
library(graphics)
p <- function(...) NULL
plot_what_is_done <- function(counts) {
done <- 0L
for (kk in seq_along(counts)) {
f <- counts[[kk]]
## Already plotted?
if (!inherits(f, "Future")) {
done <- done + 1L
next
}
## Not resolved?
## NOTE: This will block, if all workers are busy!
if (runif(1) < 0.8*(1-(done/length(counts))) || !resolved(f)) next
message(sprintf("Plotting tile #%d of %d ...", kk, n))
counts[[kk]] <- value(f)
screen(kk)
plot(counts[[kk]])
done <- done + 1L
}
counts
}
## Options
region <- getOption("future.demo.mandelbrot.region", 1L)
if (!is.list(region)) {
if (region == 1L) {
region <- list(xmid = -0.75, ymid = 0.0, side = 3.0)
} else if (region == 2L) {
region <- list(xmid = 0.283, ymid = -0.0095, side = 0.00026)
} else if (region == 3L) {
region <- list(xmid = 0.282989, ymid = -0.01, side = 3e-8)
}
}
nrow <- getOption("future.demo.mandelbrot.nrow", 5L)
resolution <- getOption("future.demo.mandelbrot.resolution", 1024L)
delay <- getOption("future.demo.mandelbrot.delay", interactive())
if (isTRUE(delay)) {
delay <- function(counts) Sys.sleep(runif(1L, min=0.5, max=5))
} else if (!is.function(delay)) {
delay <- function(counts) {}
}
## Generate Mandelbrot tiles to be computed
Cs <- mandelbrot_tiles(xmid = region$xmid, ymid = region$ymid,
side = region$side, nrow = nrow,
resolution = resolution)
message("Tiles: ", paste(dim(Cs), collapse = " by "))
if (interactive()) {
dev.new()
plot.new()
split.screen(dim(Cs))
for (ii in seq_along(Cs)) {
screen(ii)
par(mar = c(0, 0, 0, 0))
text(x = 1 / 2, y = 1 / 2, sprintf("Future #%d\nunresolved", ii), cex = 2)
}
} else {
split.screen(dim(Cs))
}
## Create all Mandelbrot tiles via lazy futures
n <- length(Cs)
message(sprintf("* Creating %d Mandelbrot tiles", n))
with_progress({
p <- progressor(along = Cs)
counts <- lapply(seq_along(Cs), FUN=function(ii) {
C <- Cs[[ii]]
future({
message(sprintf("Calculating tile #%d of %d ...", ii, n), appendLF = FALSE)
fit <- mandelbrot(C)
## Emulate slowness
delay(fit)
p(sprintf("Tile #%d (PID %d)", ii, Sys.getpid()))
message(" done")
fit
}, lazy = TRUE)
})
str(counts)
pp <- 0L
while (any(sapply(counts, FUN = inherits, "Future"))) {
counts <- plot_what_is_done(counts)
}
})
close.screen()
message("SUGGESTION: Try to rerun this demo after changing strategy for how futures are resolved, e.g. plan(multisession).\n")
|