dmd-concurrency
Shammah Chancellor
anonymous at coward.com
Tue Nov 26 04:02:18 PST 2013
On 2013-11-25 21:48:09 +0000, Chris Williams said:
> On Saturday, 23 November 2013 at 04:18:47 UTC, Shammah Chancellor wrote:
>> In my uses of channels, I have not found customizing the message box
>> size per channel to be useful. It may be, but it's not something I
>> want.
>
> I agree that I have not found box size configuration to be a
> significant gain. Being able to configure crowding behavior is probably
> more useful, but there's currently nothing about those that would
> require more than one message box per thread. (And I could envision
> adding a "force in" on-crowding behavior that pops from the head and
> inserts into the tail, but I think I could implement that in a
> reasonable method, even with a shared message box.)
>
>> I sitll think duplicate channels should behave the way I described.
>> Take IRC for example, where I am sending messages to other users, but
>> also to channels which then broadcast. I want my clients to be able
>> to simply receive() and get messages that were intended for them
>> specifically, or were broadcast. I don't want to implement complex
>> logic in order to avoid my thread hanging while trying to read from a
>> channel if I have messages available that are specific to my thread.
>
> I'm actually pretty easy on this topic. This was the one reason I
> thought of to try and merge the two systems, but shied away for the
> previously stated reasons.
>
>> With regards to SingleChannel, picking a random thread would be bad
>> for a plethora of reasons, so I agree here. I think we should continue
>> to disucss this issue. There may be some way to get Tid.receive() to
>> behave the expected way when subscribed to SingleChannels.
>
> What I would probably do, by removing receiveAll() and instead making
> receive() grab everything, is expose some methods that allow one to
> either insert directly into a thread's message box from a channel or
> register the channel as something which contains its own MessageBox
> that needs to be checked during a receive().
>
> This way, a call to receive() will by default just check the thread's
> MessageBox, and only in special cases attempt to do something more
> extravagant. The overhead for a simple check like this is reasonably
> low that I wouldn't be concerned about adding it.
>
>> Also, SingleChannels seem somewhat strange in general to me though --
>> What is the expected behavior when multiple threads receive different
>> types of mesages from the MessageBox? Does it consume messages it
>> doesn't understand until it finds one it does? This would prevent
>> other tasks which do understand them from processing. What is the use
>> case for SingleChannel that a simple synchronized Queue does not
>> acheive?
>
> I'd say that the main difference between using channels or using a
> synchronized queue are:
>
> 1. Developer preference. If you like the actor model, everything looks
> like a nail.
>
> 2. Abstraction. My SingleChannel could, for example, be sitting on top
> of something like Amazon's Simple Queue Service (a data queue that's
> maintained on one of their servers, which can have items removed by any
> number of clients). I could set up a thread that polls the SQS, pulls
> an item off, and adds it to a synchronized queue, but I might want to
> write a library that translates a request to receive() as a synchronous
> request, from that thread, to the SQS server. With the queue model, the
> library would always have to have its own polling thread. With the
> channel model, either implementation is possible.
>
> 3. Multiple entry points. receive() is currently able to directly jump
> to a handler based on the message type. With a queue, I have to make
> everything into a generic Object (or Variant), then perform type checks
> to decide what to do. std.concurrency already does all of that, so it's
> a waste to have to rewrite the same sort of handling.
>
> 4. Multiple inputs. With the ability to register to multiple data
> sources, using a queue, I have to figure out my own logic for how to
> cycle through my list of sources, so that they're getting checked
> evenly. With the channel system, that is all contained for me. I can
> call register() on 30 different pipes, and not need to have to know how
> the data is being locked, scanned for types I support, nor unpackaged
> for use. It's all just magical, upon calling receive().
What about a compromise? Extending MessageQueue to accept subscribe
to a SingleChannel/etc would be useful. I think though, that
DuplicateChannels should just poke the Tid's mbox though.
Thank you for working on this. I think it's a great initiative.
Also, can you get sending immutable messages working while you're at
it? *chortle*
-Shammah
More information about the Digitalmars-d
mailing list