gpt4 book ai didi

haskell - 在 AMQP 回调之间共享上下文

转载 作者:行者123 更新时间:2023-12-02 12:10:55 25 4
gpt4 key购买 nike

有一个关于 Haskell 的 RabbitMQ 使用的简单教程,我在其中获取了这段代码

main :: IO ()
main = do
conn <- openConnection "127.0.0.1" "/" "guest" "guest"
ch <- openChannel conn

declareQueue ch newQueue {queueName = "hello",
queueAutoDelete = False,
queueDurable = False}

putStrLn " [*] Waiting for messages. To exit press CTRL+C"
consumeMsgs ch "hello" NoAck deliveryHandler

-- waits for keypresses
getLine
closeConnection conn

deliveryHandler :: (Message, Envelope) -> IO ()
deliveryHandler (msg, metadata) =
BL.putStrLn $ " [x] Received " <> msgBody msg

它简单地解释了如何从队列中获取消息并使用回调处理它。

有一件事可能很容易解决,但我很难理解如何在回调中添加一些可变上下文,因此每次函数运行时都可以更改它。简单来说,如何计算消息在队列中的顺序。我发现一个可能的解决方案是 State monad,是吗?

第二个问题 - 所有这些回调是否并行处理?如果不是,如何并行处理它们并保持可变上下文而不发生数据竞争?

最佳答案

如果您计划并行处理多个消息(在同一个 Haskell 进程中),我会从 MVar 开始保持共享状态。

MVar 基本上是一个带锁的共享变量,以及一个合理的接口(interface)。在简单的情况下(例如计数器),这足以防止数据竞争。它是共享内存的较低级别 (IORef) 和较高级别 (STM) 抽象之间的中间地带。我认为它是最容易理解的,我将它用于所有初始原型(prototype)设计。

我不了解 RabbitMQ 库,因此无法回答您的第二个问题,即消息是否并行处理。

关于haskell - 在 AMQP 回调之间共享上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53556761/

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