gpt4 book ai didi

multithreading - 这个程序产生了多少线程(geturls9.hs)

转载 作者:行者123 更新时间:2023-12-03 12:59:46 25 4
gpt4 key购买 nike

我正在阅读 Parallel and Concurrent Programming in Haskell 的第 11 章.在那本书中,以下 program用于同时获取 URL:

main = do
xs <- foldr conc (return []) (map getURL sites)
print (map B.length xs)
where
conc ioa ioas = do
(a,as) <- concurrently ioa ioas
return (a:as)

假设“获取 URL”作业是 [g0, g1, g2] .据我了解, xs将绑定(bind)到以下结构:
g0 `conc` (g1 `conc` (g2 `conc` (return [])))

现在,我的问题是在这种情况下将创建多少个线程。我的猜测是将创建 7 个线程(与我期望用于此工作的 4 个线程相反):
 thread0: g0 `conc` (g1 `conc` (g2 `conc` (return [])))
thread1: g0
thread2: (g1 `conc` (g2 `conc` (return [])))
thread3: g1
thread4: (g2 `conc` (return []))
thread5: g2
thread6: return []

这个推理正确吗?

最佳答案

所有的猜测都是错误的!其实有线程产生。

让我们拿出大锤——

import Control.Concurrent.Async
import Control.Concurrent (myThreadId)

import qualified Data.ByteString as B

-----------------------------------------------------------------------------

sites = ["http://www.google.com",
"http://www.wikipedia.com/wiki/Spade",
"http://www.wikipedia.com/wiki/Shovel"]

getURL _ = return B.empty

annotate :: IO a -> IO a
annotate action = do
tid <- myThreadId
putStrLn $ "I'm a thread and my ID is: " ++ show tid
action

-- <<main
main = do
xs <- foldr conc (return []) (map getURL sites)
print (map B.length xs)
where
conc ioa ioas = do
(a,as) <- concurrently (annotate ioa) (annotate ioas)
return (a:as)
-- >>

传递给 concurrently 的所有操作将用 annotate 包裹,这会导致线程吐出它的 ThreadId到标准输出。运行这个我得到-

+$ ./geturls9
I'm a thread and my ID is: ThreadId 5
I'm a thread and my ID is: ThreadId 6
I'm a thread and my ID is: ThreadId 8
I'm a thread and my ID is: ThreadId 9
I'm a thread and my ID is: ThreadId 10
I'm a thread and my ID is: ThreadId 7
[0,0,0]


当然,由于 GHC 版本和赛车的差异,您对同一程序的结果几乎肯定会在 ID 号和排序的细节上有所不同。

所以,你的直觉很好!您的分析只差一个,因为整个表达式 g0 `conc` (g1 `conc` (g2 `conc` (return [])))本身没有传递给 concurrently ,所以你的 thread0当然只是主线程,而不是由异步库创建的。

注意 async 提供 mapConcurrently 用于并发处理任何 Traversable所以您不必使用 foldr 构建自己的.为什么在 Haskell 的并行和并发编程中没有提到这个函数,我不确定。它是在 async-2.0.1.0 中引入的,Haskell 平台版本 2012.4.0.0(PCPH 的介绍中提到所有代码都经过测试)包括 async-2.0.1.3。可能是教学原因,可能是通常的发布延迟以及针对旧版本的平台/库开发的代码,谁知道呢。同一介绍提到“示例代码将随着平台新版本的发布而更新。”如果您感觉强烈,请提交 erratum !

关于multithreading - 这个程序产生了多少线程(geturls9.hs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38812494/

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