朱莉娅的并行性.功能和限制

Ame*_*ina 53 python parallel-processing multithreading r julia

在他们的arXiv论文中,Julia的原作者提到了以下内容:

2.14 Parallelism.并行执行由Julia在标准库中实现的基于消息的多处理系统提供.语言设计通过提供对称协程来支持这些库的实现,协同协程也可以被认为是协同调度的线程.此功能允许异步通信隐藏在库中,而不是要求用户设置回调.朱目前不支持本地线程,这是一种限制,但具有避免同步共享内存的使用的复杂性的优点.

他们说朱莉娅不支持原生线程是什么意思?什么是本机线程?

其他解释性语言(如PythonR)是否支持这种并行性?朱莉娅独自一人吗?

Ste*_*ski 68

"本机线程"是独立的执行上下文,由操作系统内核管理,访问共享内存空间并可能在单独的内核上并发执行.将此与单独的进程进行比较,这些进程可以在多个内核上并发执行但具有单独的内存空间.确保进程很好地交互很容易,因为它们只能通过内核相互通信.确保线程不会以不可预测的错误方式进行交互非常困难,因为它们可以以不受限制的方式读取和写入相同的内存.

R情况相当简单:R不是多线程的.Python有点复杂:Python确实支持线程,但由于全局解释器锁(GIL),Python代码的实际并发执行是不可能的.其他流行的开源动态语言在本机线程方面处于各种混合状态(Ruby:no/kinda/yes ? ; Node.js:no),但总的来说,答案是否定的,它们不支持完全并发的本机线程所以朱莉娅并不孤单.

当我们向Julia添加共享内存并行性时,正如我们计划的那样 - 无论是使用本机线程还是使用共享内存的多个进程 - 它将是真正的并发性,并且不存在阻止同时执行Julia代码的GIL.然而,这是添加到语言中的一个非常棘手的功能,正如其他非常流行的成熟动态语言中不存在或有限的支持所证明的那样.添加共享内存并发模型在技术上很困难,但真正的问题是设计一个编程模型,使程序员能够以高效和安全的方式有效地使用硬件并发.这个问题一般都没有解决,是一个非常活跃的研究和实验领域 - 没有"黄金标准"可供复制.我们可以添加POSIX线程支持,但该编程模型通常被认为是危险的并且难以正确有效地使用.Go具有出色的并发性故事,但它专为编写高度并发的服务器而设计,而不是用于同时操作大型数据,因此简单地复制Go的模型对Julia来说是一个好主意并不是很清楚.

  • JPython没有GIL,并且比CPython更好地支持并发性.IronPython也是. (7认同)
  • 谢谢.当你用Python说"没有实际的Python代码并发执行"时,你的意思是在同一个过程中,对吗?根据我的理解,Python**已经**通过多处理包使用子进程支持共享内存并行性.换句话说,当你说"当我们添加[...]时,它将是真正的并发性,并且没有GIL阻止同时执行Julia代码."`,你指的是Julia用*做的事情*本机线程**,否则Julia将像Python一样实现共享内存并行性.正确? (5认同)
  • 是的,如果它处于不同的流程中,那么我们就不再讨论线程了.目前还不清楚Julia中共享内存并行性的性质是基于具有共享内存的线程还是进程,并且这种区别在任何情况下都是实现细节.Python的多处理程序包似乎确实采用了多进程共享内存并行性的形式,但它并不像我希望的那样方便或自然地用于语言级原语. (5认同)