On Thu, Jun 4, 2015 at 4:03 AM, Arnaud Loonstra <arn...@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@lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to