我的主函數有一個無限循環,我想每100毫秒執行一次循環。我知道這是通過一些並行或並行的方法完成的,但我從來沒有做過這樣的事情,甚至不知道從哪裏開始。你將如何實現這樣的功能?指定無限循環的毫秒速度
回答
假設你的循環體需要可以忽略不計的時候,只需要使用threadDelay
從Control.Concurrent
:
import Control.Concurrent
main = forever $ do
mainBody
threadDelay (100*1000) -- value in microseconds
更新:爲了解決您的循環體的時候,用這個:
import Data.Time.Clock
import Control.Concurrent
import Control.Monad
mainBody :: IO()
mainBody = putStrLn "hi"
main = forever $ do
start <- getCurrentTime
mainBody
end <- getCurrentTime
let diff = diffUTCTime end start
usecs = floor (toRational diff * 1000000) :: Int
delay = 100*1000 - usecs
if delay > 0
then threadDelay delay
else return()
您可以使用sleep在每次迭代結束時暫停循環100毫秒。 https://www.haskell.org/hoogle/?q=sleep
Haskell的主題重量輕,所以快速解決方案是在每個週期進行分岔。因此,您最終將使用主線程作爲工作線程的管理器,這可以確保每100個微工生成一個工人。
import Control.Concurrent
main =
forever $ do
forkIO $ loopCycle
threadDelay $ 100 * 10^3
如果你關心的異常不迷路,並在主線程中得到重新拋出相反,我建議考慮看看the "slave-thread" package。其實,我建議使用這個軟件包,而不是forkIO
和默認的兄弟,但是我是作者,所以我可能是主觀的。
另請注意,上述解決方案可能會導致工作線程累積,以防loopCycle
需要比100微秒更長的執行時間。爲了防止出現這種情況,您可以在經理線程中實施策略,以確保活動員工的數量有限。以下是如何實現這樣一個策略:
-- From the "SafeSemaphore" package
import qualified Control.Concurrent.SSem as Sem
main =
manager 12 (100 * 10^3) $ putStrLn "Implement me!"
manager :: Int -> Int -> IO() -> IO()
manager limit delay worker =
do
sem <- Sem.new limit
forever $ do
forkIO $ Sem.withSem sem $ worker
threadDelay delay
我會檢查圖書館。謝謝你的主意! –
「在經理線程中實施策略,這將確保活動員工數量有限」如何?使用哪些功能?有些指針會有幫助... –
@WillNess請參閱更新。 –
- 1. while循環和毫秒
- 2. Python的指定由毫秒
- 3. 速度限制在Python中的無限while循環
- 4. 指定高度的循環
- 5. 重複循環每'x'毫秒
- 6. 在Excel VBA中創建毫秒循環
- 7. 同時具有「速度」和無限「循環」的QML動畫
- 8. 快速排序劃分無限循環
- 9. 快速排序進入無限循環
- 10. 無限while循環中快速排序
- 11. 快速排序:無限循環
- 12. 通過一個快速無限循環
- 13. 無限循環:確定並分解無限循環
- 14. For循環速度
- 15. 重定向無限循環
- 16. 循環定時器/時鐘(以毫秒爲單位)
- 17. for循環毫秒轉換爲秒和分鐘
- 18. 的Java毫秒精度
- 19. 快速排序適用於指向對象的指針向量 - 無限循環
- 20. numpy ufuncs速度vs循環速度
- 21. 無限循環?
- 22. 無限循環:
- 23. 無限循環
- 24. 無限循環
- 25. 無限循環
- 26. 無限循環
- 27. 無限循環
- 28. 無限循環
- 29. (?無限)循環
- 30. 無限循環?
謝謝你的回答,但循環體需要不同的時間。一個可能需要80毫秒,另一個可能需要0。我想平均匹配所有的時間長度。 –
謝謝你的更新:) –