작은 메시지 파이프 라인을 구성하기 위해 Pipes-2.1.0 패키지와 zeromq3-haskell 패키지를 사용하고 있습니다. Frames의 마무리를 이해하는 데 문제가 있다는 것을 제외하고는 모든 것이 잘 진행되는 것 같습니다.Pipe-2.1.0 패키지 완성
다음 프레임에서는 두 가지 리소스를 얻습니다. zeromq 컨텍스트 및 zeromq 소켓이 있습니다. 그런 다음 zeromq 소켓에 게시 할 메시지 (ByteStrings
형태)를 계속 기다립니다.
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE ScopedTypeVariables #-}
module PipesZeroMQ where
import Control.Frame
import Control.IMonad.Do
import Control.IMonad.Trans
import qualified Control.Monad as M
import Data.ByteString (ByteString)
import Data.String
import Prelude hiding (Monad(..))
import qualified System.ZMQ3 as ZMQ
type Address = String
fromList :: (M.Monad m) => [b] -> Frame b m (M a) (M a)()
fromList xs = mapMR_ yield xs
publisher :: Address -> Frame Void IO (M ByteString) C()
publisher addr = do
c <- liftU $ ZMQ.init 1
s <-liftU $ ZMQ.socket c ZMQ.Pub
liftU $ ZMQ.bind s addr
liftU $ print "Socket open for business!!!"
foreverR $ do
bs <- await
finallyF (ZMQ.close s M.>> ZMQ.term c M.>> print "ZMQ socket closed") $ do
(liftU $ ZMQ.send s [] bs)
(liftU (print "Sending message"))
지금 나는이 시도하는 경우 :
λ> runFrame $ (publisher localAddress) <-< (fromList ["This", "that", "that"] >> close)
내가이 얻을 :
"Socket open for business"
"Sending message"
"ZMQ socket closed"
*** Exception: ZMQError { errno = 88, source = "send", message = "Socket operation on non-socket" }
publisher
하지만 하나 BytesString
를받은 후 확정.
왜 이런 일이 발생합니까?
Pipe-2.1.0에서 Frames를 사용하여 파이널 라이즈를 잘못 이해 한 것에 대해 어떻게 생각합니까?
내가 공격하기 시작하면 밖에서 나무가 우연히 서 있습니까?
foreverR $ do
bs <- await
finallyF (ZMQ.close s M.>> ZMQ.term c M.>> print "ZMQ socket closed") $ do
(liftU $ ZMQ.send s [] bs)
(liftU (print "Sending message"))
당신은 아마 foreverR
루프 외부 finallyF
을 배치하고 싶었 : 다음 publisher
기능을 작성할 때
가브리엘에게이 질문에 대한 답변과 훌륭한 파이프 패키지에 감사드립니다. – Eric
@ Eric 나는 첫 번째 또는 두 번째 예제가 후자의 것이 아무것도 잡히지 않기를 원한다는 것을 언급하는 것을 잊어 버렸다. 'catchF'와'finallyF'는 파이프 종료를 인터셉트 만 합니다만, 기본 모나드에서만 액션을 실행할 때 다른 파이프가 끝날 확률은 없습니다. –