R Academy · Pelajaran

Rangka Kerja future

Gunakan plan(multisession) dan future() untuk pengkomputeran selari tak segerak yang mudah alih.

Pelajaran 2 daripada 413 langkah

Rangka Kerja future ialah pelajaran R Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran R Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus R Academy merangkumi sejumlah 4 pelajaran.

Apakah Pakej future?

Pakej future menyediakan API peringkat tinggi yang seragam untuk pengaturcaraan tak segerak dan selari dalam R. Future ialah ruang letak untuk nilai yang akan tersedia kemudian — mungkin dikira pada teras atau mesin lain.

library(future)

# A simple future: computation happens asynchronously
f <- future({
  Sys.sleep(0.5)  # simulate slow work
  42
})

cat('Future created, doing other work...\n')

# Retrieve the result (blocks until done)
result <- value(f)
cat('Result:', result, '\n')

plan(): Memilih Enjin Pelaksanaan

plan() menetapkan strategi pelaksanaan untuk semua future yang seterusnya. Strategi yang paling lazim ialah sequential (lalai, satu utas), multisession (beberapa sesi R, berfungsi di semua sistem), dan multicore (percabangan proses, Unix/macOS sahaja).

library(future)

# Default: sequential (no parallelism)
plan(sequential)
cat('Strategy:', class(plan())[1], '\n')

# Parallel with separate R sessions (works on Windows too)
plan(multisession, workers = 4)
cat('Strategy:', class(plan())[1], '\n')

# Forking (Unix/macOS only, lower overhead)
if (.Platform$OS.type != 'windows') {
  plan(multicore, workers = 4)
  cat('Strategy:', class(plan())[1], '\n')
}

# Reset to sequential
plan(sequential)

value(): Menunggu Keputusan

value(f) menyekat proses semasa sehingga pengiraan future selesai, kemudian mengembalikan hasilnya. Jika future menghasilkan error, value() akan menghasilkan semula error tersebut dalam sesi pemanggil.

library(future)
plan(multisession, workers = 2)

# Launch two slow tasks concurrently
f1 <- future({ Sys.sleep(0.3); sum(1:1000) })
f2 <- future({ Sys.sleep(0.3); prod(1:10) })

# Both run in parallel; total time ~ 0.3s not 0.6s
start <- proc.time()[['elapsed']]
v1 <- value(f1)
v2 <- value(f2)
elapsed <- proc.time()[['elapsed']] - start

cat('v1:', v1, ' v2:', v2, '\n')
cat('Elapsed:', round(elapsed, 2), 's\n')

plan(sequential)

Operator %<-%

Operator %<-% ialah gula sintaks untuk future() + value() malas. Operator ini kelihatan seperti penugasan biasa, tetapi bahagian kanan berjalan secara tak segerak. Nilai diambil pada kali pertama variable diakses.

library(future)
plan(multisession, workers = 2)

# %<-% starts the computation immediately in the background
x %<-% {
  Sys.sleep(0.3)
  rnorm(5, mean = 10)
}

y %<-% {
  Sys.sleep(0.3)
  runif(5, min = 1, max = 5)
}

cat('Both running in background...\n')

# Accessing x or y here blocks until ready
cat('x:', round(x, 2), '\n')
cat('y:', round(y, 2), '\n')

plan(sequential)

Pengesanan Global Secara Automatik

Salah satu ciri paling berkuasa bagi future ialah pengesanan variable global: ciri ini mencari secara automatik variable yang dirujuk oleh kod future anda dalam persekitaran pemanggil dan menghantarnya kepada pekerja — tanpa memerlukan clusterExport() secara manual.

library(future)
plan(multisession, workers = 2)

# These globals are auto-detected and sent to the worker
threshold <- 50
multiplier <- 3

f <- future({
  x <- threshold * multiplier  # uses both globals
  x + 1
})

cat('Result:', value(f), '\n')  # 151

# Inspect which globals were identified
future_obj <- future({
  threshold + multiplier
}, lazy = TRUE)
cat('Globals found:', paste(names(future::getGlobalsAndPackages(future_obj)$globals), collapse = ', '), '\n')

plan(sequential)

future_options: Melaraskan Tingkah Laku

future.options (diakses melalui argumen options() atau future::plan()) mengawal tetapan global: memori maksimum yang dibenarkan bagi setiap future, strategi pengesanan global, dan tingkah laku tempoh tamat.

library(future)

# Cap memory per future at 500 MB
options(future.globals.maxSize = 500 * 1024^2)  # bytes

# Disable automatic global detection (manual control)
options(future.globals.onReference = 'error')

# Inspect current settings
cat('Max globals size (MB):',
    getOption('future.globals.maxSize') / 1024^2, '\n')

# Restore defaults
options(future.globals.maxSize = 500 * 1024^2)
options(future.globals.onReference = NULL)

plan(multisession, workers = 2)

# Large object: you'd get an error if it exceeds the cap
big_vec <- 1:1e5  # small enough
f <- future(sum(big_vec))
cat('Sum:', value(f), '\n')

plan(sequential)

Future Bersarang

Future boleh bersarang: sesebuah future boleh mencipta future dalaman. Secara lalai, future dalaman berjalan secara berjujukan melainkan anda menetapkan pelan bersarang dengan plan(list(...)). Ini berguna untuk keselarian dua peringkat.

library(future)

# Two-level parallelism: outer uses multisession, inner sequential
plan(list(multisession, sequential))

outer_futures <- lapply(1:3, function(i) {
  future({
    # Each outer worker runs its own sequential inner work
    inner <- lapply(1:4, function(j) i * j)
    unlist(inner)
  })
})

results <- lapply(outer_futures, value)
for (i in seq_along(results)) {
  cat('Outer', i, ':', results[[i]], '\n')
}

plan(sequential)

Pengendalian Error dengan Future

Apabila pengiraan future menghasilkan error, value() akan menghasilkan semula error tersebut. Balut value() dengan tryCatch() untuk mengendalikan error setiap future tanpa menghentikan keseluruhan aliran kerja anda.

library(future)
plan(multisession, workers = 2)

# This future will error
bad_future <- future(log(-1, base = 'oops'))  # invalid arg
good_future <- future(sqrt(144))

# Handle errors gracefully
bad_result <- tryCatch(
  value(bad_future),
  error = function(e) {
    cat('Caught error:', conditionMessage(e), '\n')
    NA
  }
)

good_result <- value(good_future)
cat('bad_result:', bad_result, '\n')
cat('good_result:', good_result, '\n')

plan(sequential)

Menyemak Status Future

resolved(f) mengembalikan TRUE jika future telah selesai tanpa menyekat proses. Dengan ini, anda boleh menyemak status siap secara berkala dan melakukan kerja yang berguna sementara menunggu, lalu membentuk gelung semakan tanpa sekatan.

library(future)
plan(multisession, workers = 2)

f <- future({
  Sys.sleep(0.5)
  'done'
})

# Poll without blocking
counter <- 0
while (!resolved(f)) {
  counter <- counter + 1
  Sys.sleep(0.1)
  cat('Polling... (', counter, ')\n')
}

cat('Future resolved! Result:', value(f), '\n')
cat('Polled', counter, 'times\n')

plan(sequential)

Menggabungkan future dengan lapply

Gabungkan lapply() dengan future() untuk mengagihkan N tugasan, dan lapply() dengan value() untuk mengumpulkan hasil. Corak ini memberikan anda kawalan jelas terhadap masa setiap future dimulakan.

library(future)
plan(multisession, workers = 4)

# Fan out: create all futures
params <- list(
  list(n = 1000, mean = 0),
  list(n = 1000, mean = 5),
  list(n = 1000, mean = 10),
  list(n = 1000, mean = -3)
)

futures <- lapply(params, function(p) {
  future({
    x <- rnorm(p$n, mean = p$mean)
    list(mean = mean(x), sd = sd(x))
  })
})

# Fan in: collect results
results <- lapply(futures, value)
for (i in seq_along(results)) {
  cat('Param mean', params[[i]]$mean,
      '-> observed mean:', round(results[[i]]$mean, 3), '\n')
}

plan(sequential)

Kes Penggunaan Sebenar: Penilaian Lipatan CV

Pengesahan silang ialah masalah yang mudah diselarikan: setiap lipatan adalah bebas. Dengan menggunakan future, anda boleh menilai semua K lipatan secara serentak, sekali gus mengurangkan masa jam dinding dengan ketara untuk model yang mahal dikira.

library(future)
plan(multisession, workers = 4)

set.seed(42)
data <- data.frame(x = rnorm(200), y = rnorm(200))
fold_ids <- sample(rep(1:4, 50))

# Launch all folds in parallel
fold_futures <- lapply(1:4, function(k) {
  future({
    train <- data[fold_ids != k, ]
    test  <- data[fold_ids == k, ]
    fit   <- lm(y ~ x, data = train)
    preds <- predict(fit, newdata = test)
    rmse  <- sqrt(mean((test$y - preds)^2))
    rmse
  })
})

rmses <- unlist(lapply(fold_futures, value))
cat('Fold RMSEs:', round(rmses, 4), '\n')
cat('Mean RMSE:', round(mean(rmses), 4), '\n')

plan(sequential)

Semakan Pantas

Anda mahu menjalankan kod selari yang berfungsi pada Windows dan macOS. Strategi plan() yang manakah patut anda pilih?

Ringkasan: Rangka Kerja future

Perkara penting:

  • future({expr}) menjalankan expression secara tak segerak; value(f) mendapatkan hasilnya
  • %<-% ialah gula sintaks — penugasan dengan penilaian future secara malas
  • plan(multisession) untuk merentas platform; plan(multicore) untuk percabangan Unix/macOS
  • Global dikesan secara automatik dan dihantar kepada pekerja — tidak memerlukan clusterExport()
  • resolved(f) menyemak penyelesaian tanpa menyekat proses
  • Balut value() dengan tryCatch() untuk aliran kerja yang tahan terhadap error
  • Sentiasa panggil plan(sequential) atau plan() untuk menetapkan semula selepas selesai
library(future)
plan(multisession, workers = 2)

# Concise pattern: fan-out then fan-in
task <- function(i) future({ i^2 + i })
results <- lapply(1:6, task)
cat(unlist(lapply(results, value)), '\n')  # 2 6 12 20 30 42

plan(sequential)
Percuma untuk bermula

Pelajari R dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
43
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Rangka Kerja future” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran R Academy, termasuk “Rangka Kerja future”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus R Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Rangka Kerja future”?

Gunakan plan(multisession) dan future() untuk pengkomputeran selari tak segerak yang mudah alih. Anda berlatih R Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan R Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran R Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Rangka Kerja future” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pakej parallel dan detectCores()
  2. Rangka Kerja future
  3. furrr: Operasi purrr Selari
  4. Menyahpepijat dan Mengimbangi Beban Kod Selari
← Kembali ke R Academy