如何在Julia函数中使用可选线程

如何在Julia函数中使用可选线程,julia,Julia,我有一个函数,可以选择使用线程作为其主循环,当参数usingthreads为true时,可以这样做。目前,代码如下所示: function dosomething(usingthreads::Bool) n = 1000 if usingthreads Threads.@threads for i = 1:n #20 lines of code here end else for i = 1:n

我有一个函数,可以选择使用线程作为其主循环,当参数
usingthreads
true
时,可以这样做。目前,代码如下所示:

function dosomething(usingthreads::Bool)
    n = 1000
    if usingthreads
        Threads.@threads for i = 1:n
            #20 lines of code here
        end
    else
        for i = 1:n
            #same 20 lines of code repeated here
        end
    end
end

比上面更糟糕的是将“20行”放在一个单独的函数中。还有其他方法吗?

您可以使用一个宏,根据
线程的结果来更改其行为。nthreads()

如果没有线程,此宏将是一个无操作:

julia> @macroexpand @maybe_threaded for i in 1:5
           print(i)
       end
:(for i = 1:5
      #= REPL[2]:2 =#
      print(i)
  end)
但当启用线程时,例如
JULIA_NUM_THREADS=4
它将扩展到线程版本:

julia>  @maybe_threaded for i in 1:5
           print(i)
       end
41325

编辑:重读这个问题后,我意识到这并不能真正回答问题,但无论如何它可能是有用的。

朱莉娅的哪个版本?Julia 1.3显著增强了线程,并使其中的一些功能变得更容易。我还没有尝试过1.3,仍然在1.2上。对于这个特定的用例,我认为您描述的方法工作得很好。但是,如果您想要合并特定于线程的优化,您可能需要这样做:
julia函数dosomething(::Val{false})#非线程case#实现在这里结束函数dosomething(::Val{true})#非线程case#线程实现在这里结束dosomething(usethreads::Bool)=dosomething(Val(usethreads))
这是一种好的风格吗?你说得非常正确:a)它没有(完全)回答我的问题,b)我可能会发现它很有用,特别是因为我还没有编写任何宏。顺便说一句,
@threads
宏在默认情况下为什么不这样工作?我的印象是,线程会带来一些开销,这样可以避免。
julia>  @maybe_threaded for i in 1:5
           print(i)
       end
41325