当CONFLATE选项设置为true时,ZMQ订阅者套接字仅保留队列中的最后一条消息。 (zmq_docs)但是,它似乎对我不起作用。通常在python中我会做类似下面的事情,它会工作:
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.setsockopt(zmq.CONFLATE, 1)
subscriber.connect("tcp://localhost:5555")
下面的pub / sub模式中的订阅者只是忽略设置为1的CONFLATE选项。您可以通过订阅者显示的分钟和秒来观察程序在处理旧消息时是否被绑定(文档42)。如果将fib设置为一个微不足道的值,您可以看到订阅者确实正在接收来自发布者的消息。
以下是发布商:
open System
open fszmq
open fszmq.Context
open fszmq.Socket
let funcPublish () =
use context = new Context()
use publisher = pub context
"tcp://*:5563" |> bind publisher
while true do
let tm = System.DateTime.Now
let t = String.Concat([tm.Minute.ToString(); " "; tm.Second.ToString()])
t |> s_send publisher
sleep 1
EXIT_SUCCESS
[<EntryPoint>]
let main argv =
funcPublish ()
0
以下是订阅者:
open fszmq
open fszmq.Context
open fszmq.Socket
let rec fib n =
match n with
| 1 | 2 -> 1
| n -> fib(n-1) + fib(n-2)
let funcSubscribe () =
use context = new Context()
use subscriber = sub context
"tcp://localhost:5563" |> connect subscriber
Socket.setOption subscriber (ZMQ.CONFLATE, 1)
[ ""B ] |> subscribe subscriber
while true do
let contents = s_recv subscriber
fib 42
contents |> printfn "%A"
EXIT_SUCCESS
[<EntryPoint>]
let main argv =
funcSubscribe ()
0
感谢。
答案 0 :(得分:6)
我注意到你的Python代码和你的F#代码之间存在一个区别。在Python中,在连接到套接字之前设置CONFLATE选项,但在F#中,在连接之后设置CONFLATE选项。
如果您将Socket.setOption
行移至F#代码中的connect subscriber
行之前,我怀疑这应该可以解决您的问题。
换句话说,而不是:
"tcp://localhost:5563" |> connect subscriber
Socket.setOption subscriber (ZMQ.CONFLATE, 1)
你应该有这个:
Socket.setOption subscriber (ZMQ.CONFLATE, 1)
"tcp://localhost:5563" |> connect subscriber