gpt4 book ai didi

haskell - 从同一个 `main` 运行两个 warp 服务器是否安全?

转载 作者:行者123 更新时间:2023-12-04 02:28:42 24 4
gpt4 key购买 nike

warp 的代码库中似乎有一些“全局变量”(unsafePerformIO + NOINLINE)。尽管如此,从同一个 main 函数运行两个 warp 实例是否安全?

最佳答案

看起来很安全。

至少在 warp-3.3.13 中,全局变量技巧(仅)用于为 vault 包生成 key ,使用如下代码:

pauseTimeoutKey :: Vault.Key (IO ())
pauseTimeoutKey = unsafePerformIO Vault.newKey
{-# NOINLINE pauseTimeoutKey #-}

请注意,这与“通常的”全局变量技巧不同,因为它不会创建多个线程可能尝试使用的全局 IORef,而每个线程都期望成为引用的唯一用户。

相反,vault 包提供了一个类型安全的、持久的“存储”,一个 Vault,它就像各种类型的可变变量的集合,可以通过独特的 key 。 key 在 IO 中生成,有效地使用 Data.Unique 中的 newUniqueVault 本身是一个纯粹、安全的数据结构。它使用不安全的操作实现,但以使其安全的方式构建。最终,它是一个 HashMap,从 Key a(因此,类型注释的 Integer)到 Any 值可以 unsafeCoerced 到所需的类型 a,类型安全由附加到 key 的类型保证。 Vault 中的值通过在映射中插入新值、创建更新的 Vault 来“改变”,因此这里没有实际发生改变。

由于 Vault 只是花哨的不可变 HashMap 的纯值,所以没有两个服务器覆盖彼此的 vault 值的危险,即使它们正在使用相同的键。

据我所知,确保安全所需的全部是,当一个线程调用类似pauseTimeoutKey的东西时,它总是获得相同的 key ,并且该 key 在该 key 中是唯一的线。因此,它基本上归结为一般全局变量技巧和在 unsafePerformIO 下使用时 newUnique 的线程安全。

我从来没有听说过任何关于在多线程代码中使用全局变量技巧的警告,unsafePerformIO 旨在实现线程安全(这就是为什么有一个单独的“更高效但可能线程不安全”版本 unsafeDupablePerformIO)。

newUnique 本身是以线程安全的方式实现的:

newUnique :: IO Unique
newUnique = do
r <- atomicModifyIORef' uniqSource $ \x -> let z = x+1 in (z,z)
return (Unique r)

而且我看不出在 unsafePerformIO 下运行它会如何使其成为线程不安全的。

关于haskell - 从同一个 `main` 运行两个 warp 服务器是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65615460/

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