Dear Adrian,
Thank you very much for your reply and for the pseudo-code.

Unfortunately, I'm not sure if Python allows users to have a lower level
control like when calling proactor_done() or proactor_wait() in C, but I
will surely try to understand if it is possible to implement a logic
similar to the one you suggested.

In the meantime, I discovered the possibility of using a
"BlockingConnection", to send messages without the need of sticking to an
explicit event loop (an example is available here:
https://github.com/apache/qpid-proton/blob/master/python/examples/helloworld_blocking.py
).
However, I'm often getting a "local-idle-timeout expired" error. Probably
I'm missing something, but I don't really know, even after quite a lot of
debugging, why this error is occurring.
I will try to send another dedicated message to the mailing list to try to
understand if there is something wrong in my attemps (or if this may be
some sort of bug?).

Thank you very much,
Francesco


Il giorno ven 17 lug 2020 alle ore 01:42 Adrian Florea <florea....@gmail.com>
ha scritto:

> Hi,
>
> For certain reasons I can't paste code here, so I'll try to give a
> pseudo-code algorithm that worked for me with Proton-C. Don't know how much
> control you have with the Python client.
>
> --- Step 1: init ---
>
>    - Initialize proton/main event loop up to the moment you get the FLOW
>    event --> yield
>
>
>
> ---- Step 2:  program main loop ----
>
> While(true)
>
> {
>
> Read from external
>
>            If (nothing read) then
>
>               {
>
>               if (AMQP echo must be sent) then
>
>                  {
>
>    amqp_send(echo_message)
>
>    adjust the tracking of link credit
>
>    resume proactor main event loop (proactor_done + proactor_wait) and
> handle events --> if FLOW event is seen then yield
>
>
>     continue
>
>     }
>
> }
>
>
> else if (message read)
>
> {
>
>
> amqp_send(message)
>
> adjust the tracking of link credit
>
>                 resume proactor main event loop (proactor_done +
> proactor_wait) and handle events --> if FLOW event is seen --> yield
>
>  }
>
> }
> Others may have better ideas, I am just beggining to use Proton-C.
>
> Hope this helps,
> Adrian
>
> On Thu, Jul 16, 2020, 8:36 AM Francesco Raviglione <
> francescorav.es...@gmail.com> wrote:
>
> > Dear Adrian,
> > Thank you very much for your reply.
> >
> > I tried following your suggestion, by attempting to find a way to call an
> > external function reading the data from an external source, and returning
> > it when available.
> >
> > However, unfortunately, it seems to be slightly easier to control the
> > behaviour of the event loop in C than in Pyhton.
> > In particular, in Python, if I call any blocking function (even a
> > time.sleep(0.1), sleeping for just 100 ms) inside "on_sendable", the
> > messages are only buffered and never sent (do you know why? Is the
> > "on_sendable" handler supposed to be executed as fast as possible without
> > blocking to have the messages being sent immediately?).
> > If, instead, I just do not block and send the data only if available (for
> > instance by implementing a mechanism equivalent to a non-blocking read
> from
> > a pipe, with poll(), letting "on_sendable" finish without sending
> anything,
> > if there is no data available), only one "on_sendable" event is generated
> > and the event loop does not seem to return any other event which I could
> > use to send the data, which may be now available (for example, the
> > equivalent of C's PN_DELIVERY does not seem to exist).
> >
> > Do you know if there are other ways to solve this issue?
> > When you were "yielding" the control of the main loop to an external
> > function, was it blocking in some way, waiting for data to be available?
> >
> > Thank you very much,
> > Francesco
> >
> >
> > Il giorno mer 15 lug 2020 alle ore 18:40 Adrian Florea <
> > florea....@gmail.com>
> > ha scritto:
> >
> > > Hi Francesco,
> > >
> > > I achieved similar behavior but using Qpid Proton-C (AMQP send-only
> > > program).
> > >
> > > After initialiazing proton and getting the first FLOW event, I simply
> > > "yield" main event loop control to an external/looping function that
> can
> > > read from a different source and then send the same message to an AMQP
> > > destination.
> > >
> > > It may seem hard in the beggining but once you get a hold on how to
> > > integrate proton events loop into your program loop, it has good
> chances
> > to
> > > work.
> > >
> > > Adrian
> > >
> > >
> > > On Wed, Jul 15, 2020, 11:22 AM Francesco Raviglione <
> > > francescorav.es...@gmail.com> wrote:
> > >
> > > > Dear all,
> > > > I'm trying to use the Python version of Qpid Proton to send data to
> an
> > > AMQP
> > > > 1.0 broker.
> > > > I've seen that several examples are sending data which was
> > > > available/defined before the AMQP event loop is started.
> > > > However, I need to send data only when it becomes available from an
> > > > external process (for example by waiting for it on a Pipe, with
> > > > self.amqp_pipe_end.recv()), and then send it immediately to the
> broker.
> > > > If I try to wait on a pipe inside "on_sendable", no message is
> actually
> > > > transferred to the broker, as the event loop is "blocked" waiting for
> > new
> > > > data and cannot manage properly the AMQP 1.0 connection (is this
> > > correct?).
> > > > How could I achieve the desired result? How can I make the loop wait
> > for
> > > > external data and then immediately send it?
> > > >
> > > > Thank you very much in advance,
> > > > Francesco Raviglione
> > > >
> >
>

Reply via email to