Julia:即使被要求运行多个进程,spawnat 也始终在相同的线程上运行
Posted
技术标签:
【中文标题】Julia:即使被要求运行多个进程,spawnat 也始终在相同的线程上运行【英文标题】:Julia: spawnat always runs on the same threads even if asked to run for multipleprocesses 【发布时间】:2022-01-17 01:42:25 【问题描述】:我正在尝试在 Julia 的不同线程上运行相同的模拟。我的电脑有4个核心。
我检查了Threads.nthreads() =4
,并添加了进程以便nprocs() = 4
。
现在我正在尝试并行运行相同的模拟:simulation()
。
我的代码是
@spawnat 1 simulation()
@spawnat 2 simulation()
@spawnat 3 simulation()
@spawnat 4 simulation()
simulation
函数也会显示它在哪些线程上运行,这要归功于 println(Threads.threadid())
问题是所有进程都在同一个线程上运行 - 线程号 1。
我认为创建worker并使用@spawnat
宏应该足以让模拟在所有线程上运行。
你知道该怎么做吗?我做错了什么?提前致谢
【问题讨论】:
【参考方案1】:我认为您可能会混淆多线程和多处理?来自文档:
help?> @spawnat
@spawnat p expr
Create a closure around an expression and run the closure asynchronously on process p
因此,您的代码将在您使用addprocs
创建的工作进程之一上执行。正在执行的代码是否使用多个线程取决于代码本身是否是多线程的,例如正在使用@threads
宏。
Julia 手册讨论了多线程 here 和多处理 here。
编辑补充:关于 Julia Discourse here 的讨论包括运行多线程工作进程的示例 - 为此,您需要设置一个环境变量以确保工作进程以多个线程启动。
【讨论】:
我不知道并行代码,也无法从文档的介绍中真正分辨出线程或进程是什么,它们听起来非常相似。谷歌学习也令人困惑,因为这些术语在其他上下文和语言中具有不同的含义。我认为文档将受益于添加 ELI5 解释,例如如何将任务解释为计划的无参数函数,可以暂停以轮到计划队列中的下一个任务。 @BatWannaBe 我认为这里的文档已经做得很好了:docs.julialang.org/en/v1/manual/parallel-computing。 OTOH,线程和进程实际上是独立于语言的基本构建块,类似于整数与浮点数。我不认为详细解释操作系统和架构概念是文档的工作。 该页面提到共享/不共享内存很有帮助,谢谢。以上是关于Julia:即使被要求运行多个进程,spawnat 也始终在相同的线程上运行的主要内容,如果未能解决你的问题,请参考以下文章