Hi there, What happens if you add a (sleep 1) just before making the new thread? Also, what lisp implementation are you using?
I don't have familiarity with the pzmq lisp binding. If you like, though, you could also try the cl-czmq <https://github.com/lhope/cl-czmq> binding I wrote. Luke On Mon, Sep 23, 2013 at 9:42 AM, Alexander Pugachev < [email protected]> wrote: > Hi, > > I am using ZeroMQ 3 with Common Lisp library pzmq. I am trying to send a > message to server part of inproc PAIR in the main thread from client side > of PAIR in a thread derived from main. It looks like recv-string operation > blocks both threads at the same time while poll does not. > > recv-string basically call msg-init, then calls msg-recv until ZMQ_RCVMORE > is returned by getsockopt(). It's ok that it blocks, I just do not > understand why it blocks other thread. > > This code > > (defun a(endpoint) >> (pzmq:with-socket socket :pair >> (log:info "in thread") >> (pzmq:connect socket endpoint) >> (log:info "connected") >> (pzmq:send socket "test") >> (log:info "sent"))) >> (defun simple-inproc-test() >> (let ((endpoint "inproc://s")) >> (pzmq:with-socket socket :pair >> (pzmq:bind socket endpoint) >> (log:info "bound") >> (bt:make-thread (lambda () (a endpoint)) >> :name "the-thread") >> (log:info "before recv-string") >> (log:info (pzmq:recv-string socket)) >> (log:info "after recv-string!"))))) > > > logs only > > <INFO> [02:13:51] hi tmp.Osy6Ca (simple-inproc-test) - bound >> <INFO> [02:13:51] hi tmp.Osy6Ca (simple-inproc-test) - before recv-string > > > and when I terminate main thread (running function simple-inproc-test) I > see "<INFO> [02:13:54] hi tmp.CTSEWq (a) - in thread" and then obciously > child thread dies when it tries to send a message in the socket without > running server side. > > If I replace the recv-string line with polling loop returning on first > occurence of POLLIN in the socket I successfully receive the message: > > (pzmq:with-poll-items items (socket) >> (loop >> (pzmq:poll items) >> (when (member :pollin (pzmq:revents items 0)) >> (log:info (pzmq:recv-string socket)) >> (return)))) > > > > > I was trying to play with parameters of context, sockets and was trying to > create sockets in different contexts and in the same context passed to new > thread function - it is all the same, and now I think this is some ZeroMQ > principle I haven't read or understood. > > Am I doing something completely wrong? How blocking receive operation in > one thread can block other thread as well? > > Thanks, Alexander. > > > _______________________________________________ > zeromq-dev mailing list > [email protected] > http://lists.zeromq.org/mailman/listinfo/zeromq-dev > > -- --------------------------------------------------- Dr Lucas Hope - lucas.r.hope@skype Machine Learning and Software Engineering Consultant Melbourne, Australia
_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
