If I understand correctly, what you point out is what I meant by:
"""
> Deliveries to a given single inbox will be in-order. But I don't think you
> can guarantee delivery is in order when considering, as a whole, a
> sequence of messages sent to two or more inboxes.
"""
But your example is probably a clearer way to express this.

My references to guaranteed in-order delivery was intended to refer to the
context of messages flowing through a single inbox-outbox linkage. Though
I don't think I stated this very explicitly. Apologies - that was likely
the victim of a last minute C+P job on the email and me not taking the
time to read the final result sufficiently carefully.


Matt

> On Thursday 08 October 2009 13:45:08 Matt Hammond wrote:
>> Yes, its
>> purpose when I coded it was to ensure queues are flushed.
>
> It does not guarantee in order delivery though, when you chain 2 threaded
> components together
>
> Specifically, given this sequence of messages being *logically* sent:
>
> ProducerThread
>     ( 1, "outbox")
>     ( 2, "outbox")
>     ( 3, "outbox")
>
>     ( 4, "outbox")
>     ( 5, "outbox")
>     ( 6, "outbox")
>
>     ( 7, "outbox")
>     ( 8, "outbox")
>     ( producerFinished, "signal")
>
> Note that I've divided those into 3 chunks of messages.
> These get appended to outqueues in that order.  Due to the way this
> loop...
>
>           for box in self.outboxes:
>
> ... works this ensures that these will get sent to the actual outboxes as
> follows:
>     ( 1, "outbox")
>     ( 2, "outbox")
>     ( 3, "outbox")
>
>     ( 4, "outbox")
>     ( 5, "outbox")
>     ( 6, "outbox")
>
>     ( 7, "outbox")
>     ( 8, "outbox")
>     ( producerFinished, "signal")
>
> This arrives in the inboxes of the recipient:
>     ( 1, "inbox")
>     ( 2, "inbox")
>     ( 3, "inbox")
>
>     ( 4, "inbox")
>     ( 5, "inbox")
>     ( 6, "inbox")
>
>     ( 7, "inbox")
>     ( 8, "inbox")
>     ( producerFinished, "control")
>
> Now we hit the problem point. We hit this loop:
>           for box in self.inboxes:
>
> This causes this delivery order - control box, then inbox. This comes in
> fits
> and starts - due to timeslice interleaving:
>    { no control messages }
>     ( 1, "inbox")
>     ( 2, "inbox")
>     ( 3, "inbox")
>
>    { no control messages }
>     ( 4, "inbox")
>     ( 5, "inbox")
>     ( 6, "inbox")
>
>     ( producerFinished, "control")
>     ( 7, "inbox")
>     ( 8, "inbox")
>
> The consumer then exits early. This is because order is not guaranteed in
> this
> way by the implementation. It's a rather subtle bug, one only really
> visible
> if you are connecting two threads together.
>
>
> Michael.
> --
> http://yeoldeclue.com/blog
> http://twitter.com/kamaelian
> http://www.kamaelia.org/Home
>
> >
>


-- 
| Matt Hammond
|
| [anything you like unless it bounces] 'at' matthammond 'dot' org




--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"kamaelia" group.
To post to this group, send email to kamaelia@googlegroups.com
To unsubscribe from this group, send email to 
kamaelia+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/kamaelia?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to