gpt4 book ai didi

multithreading - Haskell 中 ConcurrentHashMap 的类比是什么?

转载 作者:行者123 更新时间:2023-12-04 16:51:36 25 4
gpt4 key购买 nike

更新 : 请记住,我刚刚开始学习 Haskell

假设我们正在编写一个具有以下一般功能的应用程序:

  • 启动时,它从外部来源收集一些数据;
  • 该数据是一组包含列表的复杂结构,
    数组、整数、字符串等;
  • 运行时,应用程序提供 Web API(servlet),提供
    访问数据。

  • 现在,如果应用程序是用 Java 编写的,我们可以使用静态 ConcurrentHashMap 对象来存储数据(代表 Java 类)。这样,在启动期间,应用程序可以用数据填充 map ,然后 servlet 可以访问它,为客户端提供一些 API。

    如果应用程序是用 Erlang 编写的,我们可以使用 ETS/DETS 来存储数据(作为原生 Erlang 结构)。

    现在的问题是:实现这种设计的正确 Haskell 方式是什么?
    它不应该是 DB,它应该是某种轻量级的内存中的东西,可以存储复杂的结构(Haskell native 结构),并且可以从不同的线程(servlet,通过 Java 世界实体交谈)访问。在 Haskell 中:没有 Java 中的静态全局变量,没有 Erlang 中的 ETS 和 OTP,那么如何以正确的方式做到这一点(不使用 Redis 等外部解决方案)?

    谢谢

    更新 :问题的另一个重要部分 - 因为 Haskell 没有(?)有“全局静态”变量,那么实现这个“全局可访问”数据保存对象的正确方法是什么(比如说,它是“stm-containers” )?我应该在“主”函数中的某个地方初始化它,然后将它传递给每个 REST API 处理程序吗?或者还有其他更正确的方法吗?

    最佳答案

    从您的问题中不清楚客户端 API 是否会提供改变数据的方法。

    如果不是(即 API 仅用于查询),那么任何不可变数据结构就足够了,因为不可变数据的一个优点是可以从多个线程安全地访问它,并确保它不会改变。无需使用锁或其他策略来处理并发性的开销。您只需在初始化期间构造不可变数据,然后查询它。为此,请考虑像 "unordered-containers" 这样的包.

    如果您的 API 也将改变数据,那么您将需要可变数据结构,这些数据结构针对并发性进行了优化。 "stm-containers"是一个包,它提供了这些。

    关于multithreading - Haskell 中 ConcurrentHashMap 的类比是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36721863/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com