Returns a crew::crew_controller_local() tuned for pipelines that run Python or Julia steps. Because reticulate and JuliaCall embed a single interpreter per process (see vignette("get_started", package = "tarpolyglot")), the only way to get a fresh interpreter per target, and to use different environments/versions across targets, is process-level isolation. Passing this controller to targets::tar_option_set() sends targets to separate worker processes; with tasks_max = 1 each worker is retired after one task, so every foreign step gets a clean interpreter that is torn down when the task finishes.
Arguments
- workers
Integer number of parallel worker processes. Default
2.- tasks_max
Integer max tasks a worker runs before it is retired (and its embedded interpreter torn down). Default
1for maximum isolation: a fresh Python/Julia per target. Raise it (or setInf) to reuse interpreters for throughput, accepting that same-language steps on a worker then share the foreign global namespace and one environment.- seconds_idle
Numeric seconds an idle worker waits before shutting down. Default
30.- ...
Further arguments passed to
crew::crew_controller_local(), e.g.seconds_timeout,garbage_collection, orreset_globals.
Details
This is the recommended default for polyglot pipelines. Put it near the top of _targets.R:
targets::tar_option_set(controller = tarpolyglot::polyglot_controller())On a system where crew cannot build a controller at all, this function fails with an explanation instead of passing the underlying error through. The case seen in practice is a nanonext installed without TLS support: crew self-tests nanonext's TLS layer whenever a controller is constructed, even though this controller requests no TLS, and that self-test reports "Not supported". The remedy is to reinstall nanonext on a system where TLS support is available, or to run the pipeline with no controller at all, which costs only the per-step interpreter isolation described above.
Examples
if (FALSE) { # \dontrun{
# _targets.R
library(targets)
library(tarpolyglot)
tar_option_set(controller = polyglot_controller(workers = 4))
list(
tar_target_py(x, "scripts/step.py", retrieve = "result")
)
} # }