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