[zeromq-dev] zproject python binding mixing with pyZMQ
MinRK
benjaminrk at gmail.com
Fri Jun 5 00:30:01 CEST 2015
On Thu, Jun 4, 2015 at 4:03 AM, Arnaud Loonstra <arnaud at sphaero.org> wrote:
> On 2015-06-02 13:56, Arnaud Loonstra wrote:
> > On 2015-05-03 16:25, Arnaud Loonstra wrote:
> >> Hi all,
> >>
> >> I'm testing the new python bindings from zproject. As a test I was
> >> trying the Zyre bindings. In Zyre you can retrieve the socket using
> >> socket() in case you want to add it to a poller. However the socket
> >> method returns a <class 'zyre.LP_zsock_t'> type which not hashable
> >> and
> >> probably won't be understood by pyZMQ.
> >>
> >> Any ideas how to deal with this? I think it would make sense if the
> >> binding is inter operable with PyZMQ.
> >>
> >
> > To make this work the generator needs to address for the socket types
> > beginning with:
> > --- a/bindings/python/zyre.py
> > +++ b/bindings/python/zyre.py
> > @@ -45,6 +45,14 @@ zyre_p = POINTER(zyre_t)
> >
> > class zsock_t(Structure):
> > pass # Empty - only for type checking
> > +zsock_t._fields_=[
> > + ("tag", c_uint),
> > + ("handle", c_void_p),
> > + ("endpoint", c_char_p),
> > + ("cache", c_char_p),
> > + ("type", c_int),
> > + ("cache_size", c_size_t)
> > + ]
> > zsock_p = POINTER(zsock_t)
> >
> > The handle is an actual zmq socket. We only need to get to it's file
> > descriptor to be able to use it in a select/poll.
> >
> > Perphaps the handle can be converted to a PyZMQ socket type?
>
> I might have some proof of concept code. I changed this to zyre.py:
>
> --- a/bindings/python/zyre.py
> +++ b/bindings/python/zyre.py
> @@ -44,7 +44,14 @@ class zyre_t(Structure):
> zyre_p = POINTER(zyre_t)
>
> class zsock_t(Structure):
> - pass # Empty - only for type checking
> + _fields_=[
> + ("tag", c_uint),
> + ("handle", c_void_p),
> + ("endpoint", c_char_p),
> + ("cache", c_char_p),
> + ("type", c_int),
> + ("cache_size", c_size_t)
> + ]
> zsock_p = POINTER(zsock_t)
>
> This simple example shows getting the zyre socket as a PyZMQ socket
>
> >>> from zyre import Zyre
> >>> import zmq
> >>> z1 = Zyre('t1')
> >>> s = z1.socket()
> >>> print(s)
> <zyre.LP_zsock_t object at 0x7fd6e3439170>
> >>> print(s.contents.endpoint)
> inproc://pipe-ee96-5a9d
> >>> sock_pointer = s.contents.handle
> >>> s2 = zmq.Socket(shadow=sock_pointer)
> >>> print(s)
> <zmq.sugar.socket.Socket object at 0x7fd6e3473390>
> >>> print(s2.closed)
> False
> >>> print(s2.get_hwm())
> 1000
> >>> print(s2.underlying)
> 44483568
> >>> print(s2.get(zmq.FD))
> 9
>
> I'm not sure whether this is interchangeable with CFFI and Cython
>
Shadowing libzmq sockets with pyzmq should work fine in both CFFI and
Cython.
-MinRK
>
> Rg,
>
> Arnaud
> _______________________________________________
> 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/20150604/9e3766d4/attachment.htm>
More information about the zeromq-dev
mailing list