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 也始终在相同的线程上运行的主要内容,如果未能解决你的问题,请参考以下文章

摆脱 Julia 的“警告:为未更改的字符串重新定义常量”?

如何运行资源内的exe 以线程运行exe

Android:IPC之AIDL的学习和总结

Android学习羁绊之Service

如何在 Windows 上使用多个版本的 Julia

多线程与多进程的实现