我刚刚在Coursera完成了Martin Odersky的scala课程.Scala是我的第一个FP语言,我对限制可变状态的想法很兴奋.这允许更容易的并发性并且还使代码超级可维护.
在学习所有这些的同时,我意识到你可以保证对象的可变性,只要它没有可变变量并且只引用了不可变对象.所以现在我可以通过创建一个新状态而不是修改旧状态来做任何事情,尽可能使用尾递归.
大.所以我到目前为止只能做到这一点.在某些时候,我的应用程序需要能够修改一些现有的状态.我知道在这一点上放入并发控制的地方,锁定,等等等等.我仍然默认使用我一直使用的标准多线程并发控制.
哦斯卡拉社区,还有更好的方法吗?莫纳德也许?
编辑:这个问题有点笼统,所以我想给出一个用例:我有一个机器学习算法,可以存储几个数据集合.它们具有返回数据(训练等)的更新表示的函数,所有函数都是不可变的.最终,我可以将这个返回更新状态模式保持在运行模拟的实际对象上.它具有可变的状态并保存对集合的引用.我可能想分发到多核或多系统.
这是一个广泛的问题,但我很好奇在具有多个物理 CPU 的机器上的单个进程应用程序中线程调度的细节。
编辑 - 想澄清下面我在谈论物理 CPU。我已经很好地处理了进程/线程如何与多核 CPU 一起工作,但我说的是主板上的多个物理 CPU 染料(如 2 个 4 核至强)。
答案 - 多亏了 Brokenfoot 和 nosid 的回应,我想我已经明白了: - Linux 调度程序有不同的 NUMA 策略,这些策略会影响线程调度,因为它们与内核/染料有关的内存突变/访问模式。- 染料之间的缓存一致性是可能的,但速度比预期的要慢。- 最佳行动方案 - 控制共享内存的可变性(尽量保持不变) - 使用尊重线程局部性的内部(进程内)任务调度程序 - 使用与进程内任务调度程序配合使用的 NUMA 策略
假设:
所以情况:
问题:
linux parallel-processing multithreading process linux-kernel