[zeromq-dev] Is there a way to avoid sleep operation before sending messages ?

Doron Somech somdoron at gmail.com
Mon May 16 08:39:39 CEST 2016


Maybe pubsub is the wrong pattern for you. Pubsub in zeromq is like radio,
if you didn't listen you missed it. You have the clone pattern in the guide
if you need reliable pubsub.

If you just want to solve the sync problem, use PULL that wait for N
messages where N is the number of threads. Each thread when started open
PUSH socket, connect and send one message.
On May 16, 2016 00:49, "Teng Zhang" <tengz at seas.upenn.edu> wrote:

> Hi, I am now working on a simple case where a multi-threaded program tries
> to send a message to a proxy. The program is written in C and the
> czmq-3.0.2_3 is used. The platform is Mac OS X.
>
> Here is the the code fragment of the sender:
>
>   publisher = zsock_new_pub (">tcp://localhost:5559");
>  zsock_resolve (publisher);
>  ....
>  str = "abc";
>  //usleep(2000);
>  zstr_send (publisher, str);
>
>
> Here is the code fragment of the proxy:
>
>  bool verbose = true;
>
>     // Create and configure our proxy
>  zactor_t *proxy = zactor_new (zproxy, NULL);
>  assert (proxy);
>  if (verbose) {
>      zstr_sendx (proxy, "VERBOSE", NULL);
>      zsock_wait (proxy);
>  }
>     zstr_sendx (proxy, "FRONTEND", "XSUB", "tcp://*:5559", NULL);
>     zsock_wait (proxy);
>     zstr_sendx (proxy, "BACKEND", "XPUB", "tcp://*:5560", NULL);
>     zsock_wait (proxy);
>
>     // Test capture functionality
>     zsock_t *capture = zsock_new_pull ("inproc://capture");
>     assert (capture);
>
>     // Switch on capturing, check that it works
>     zstr_sendx (proxy, "CAPTURE", "inproc://capture", NULL);
>     zsock_wait (proxy);
>
>     // Setup loop for captures
>     zloop_t *loop = zloop_new ();
>     assert (loop);
>     zloop_set_verbose (loop, verbose);
>
>     // Set up reader for captures
>     int rc = zloop_reader (loop, capture, capture_event, NULL);
>     assert (rc == 0);
>     zloop_reader_set_tolerant (loop, capture);
>     zloop_start (loop);
>
> capture_event is the call back function:
>
> static int
> capture_event (zloop_t *loop, zsock_t *reader, void *arg)
> {
>     zmsg_t *msg = zmsg_recv (reader);
>     char *msg_str = zmsg_popstr (msg);
>     printf ("CAPTURED: %s\n", msg_str);
>     free (msg_str);
>     zmsg_destroy (&msg);
>     return 0;
> }
>
> There is another process that can receive the data from the proxy by the
> port 5560, which is not shown here.
>
> The problem is that if there is no sleep operation before zstr_send, the
> proxy cannot receive and print out the message. I also have tried to use
> sched_yield() to replace sleep but it does not work. Moreover, if there are
> more threads of sender, the sleep time needs to be longer to make sure that
> the proxy can receive all the messages. I am wondering if there is any way
> not to use sleep to send the message.
>
> Thanks
>
>
>
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20160516/b60e8d48/attachment.htm>


More information about the zeromq-dev mailing list