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