From 767276abd42940d271714f90f343a445204edf0c Mon Sep 17 00:00:00 2001 From: Milan Bouchet-Valat Date: Sat, 7 Oct 2023 21:53:26 +0200 Subject: [PATCH] Fixes --- .github/workflows/ci.yml | 2 +- docs/src/lib/functions.md | 3 ++- src/other/utils.jl | 20 ++++++++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4222741a09..5bbb7f0772 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1 env: - JULIA_NUM_THREADS: 4 + JULIA_NUM_THREADS: 4,1 - uses: julia-actions/julia-processcoverage@v1 - uses: codecov/codecov-action@v1 with: diff --git a/docs/src/lib/functions.md b/docs/src/lib/functions.md index 625cf60665..1cb8dfd66c 100644 --- a/docs/src/lib/functions.md +++ b/docs/src/lib/functions.md @@ -7,7 +7,8 @@ CurrentModule = DataFrames ## Multithreading support By default, selected operations in DataFrames.jl automatically use multiple threads -when available. It is task-based and implemented using the `@spawn` macro from Julia Base. +when available. Multi-threading is task-based and implemented using the `@spawn` +macro from Julia Base. Tasks are therefore scheduled on the `:default` threadpool. Functions that take user-defined functions and may run it in parallel accept a `threads` keyword argument which allows disabling multithreading when the provided function requires serial execution or is not thread-safe. diff --git a/src/other/utils.jl b/src/other/utils.jl index 4d264340b7..78f91785b1 100644 --- a/src/other/utils.jl +++ b/src/other/utils.jl @@ -229,14 +229,15 @@ macro spawn_or_run_task(threads, ex) Base.replace_linenums!(thunk, __source__) end var = esc(Base.sync_varname) + spawn_set_thrpool = VERSION >= v"1.9.0" ? + :(Base.Threads._spawn_set_thrpool(task, :default)) : + :() quote let $(letargs...) if $(esc(threads)) local task = Task($thunk) task.sticky = false - if VERSION >= v"1.9.0" - Base.Threads._spawn_set_thrpool(task, :default) - end + $(spawn_set_thrpool) else # Run expr immediately res = $thunk() @@ -259,16 +260,23 @@ end Equivalent to `Threads.@spawn` if `threads === true`, otherwise run `expr`. """ -macro spawn_or_run(threads, expr) - letargs = Base._lift_one_interp!(expr) +macro spawn_or_run(threads, ex) + letargs = Base._lift_one_interp!(ex) - thunk = esc(:(()->($expr))) + thunk = :(()->($(esc(ex)))) + if VERSION >= v"1.10.0-DEV" + Base.replace_linenums!(thunk, __source__) + end var = esc(Base.sync_varname) + spawn_set_thrpool = VERSION >= v"1.9.0" ? + :(Base.Threads._spawn_set_thrpool(task, :default)) : + :() quote let $(letargs...) if $(esc(threads)) local task = Task($thunk) task.sticky = false + $(spawn_set_thrpool) if $(Expr(:islocal, var)) put!($var, task) end