Skip to content

push/pull pair with :streamer device example #36

@hxzrx

Description

@hxzrx

Hi,
The code below is an simple example of push/pull pair with :streamer device, and the backend workers run in threads, everything is OK!

(ql:quickload :pzmq)
(ql:quickload :bordeaux-threads)

(defun streamer-device (front back)
  (pzmq:with-sockets ((frontend :pull) (backend :push))
    (pzmq:bind frontend front)
    (pzmq:bind backend back)
    (dotimes (i 2)
      (pzmq:with-context nil
        (bt:make-thread (lambda ()
                          (pzmq:with-socket recv :pull
                            (pzmq:connect recv back)
                            (loop (format t "Streamer pulled a msg: ~d" (pzmq:recv-string recv))))))))
    (pzmq:device :streamer frontend backend)
    ;; Or use proxy
    #+:ignore(pzmq:proxy frontend backend (cffi:null-pointer))))

(defun send-streamer (endpoint)
  (pzmq:with-sockets ((sender :push))
    (pzmq:connect sender endpoint)
    (pzmq:send sender "hello")))

Tests with:

(bt:make-thread (lambda ()
                  (streamer-device "tcp://127.0.0.1:5558" "tcp://127.0.0.1:5559")))
(sleep 0.5)
(send-streamer "tcp://127.0.0.1:5558")

(bt:make-thread (lambda ()
                  (streamer-device "tcp://127.0.0.1:5561" "ipc://workers")))
(sleep 0.5)
(send-streamer "tcp://127.0.0.1:5561")

(bt:make-thread (lambda ()
                  (streamer-device "tcp://127.0.0.1:5560" "inproc://workers")))
(sleep 0.5)
(send-streamer "tcp://127.0.0.1:5560")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions