Eric, thats exactly why I suggested the use of the Result or Either type. Some is a bit misleaning, because the Nothing case is usually means a failure rather than a success.
On Sat, Dec 21, 2013 at 9:33 PM, Eric Reed <ecr...@cs.washington.edu> wrote: > IMO the best alternative for a non-blocking send on a bounded channel is > returning an Option. > If you send successfully, you return None. > If you can't send because the channel is full, you return Some(message). > This lets the sender recover the message (important for moveable objects) > and decide how to handle it (retry, fail, drop, etc.). > > Personally, I lean toward providing unbounded channels as the primitive > and implementing bounded channels on top of them OR providing both as > primitives. > > > On Fri, Dec 20, 2013 at 4:19 PM, Carter Schonwald < > carter.schonw...@gmail.com> wrote: > >> actually, you're right, in go they're fixed sized buffers >> http://golang.org/src/pkg/runtime/chan.c . I can understands (and >> agree!) that this is not a good default if a more dynamic data structure >> can work well. >> >> in haskell / ghc , bounded channels are dynamically sized, and merely >> have a max size thats enforced by the provided api,and I've been speaking >> with that sort of memory usage model in mind. >> >> >> On Fri, Dec 20, 2013 at 4:15 PM, Carter Schonwald < >> carter.schonw...@gmail.com> wrote: >> >>> i'd be very very surprised if bounded channels in go don't dynamically >>> resize their queues and then atomically insert / remove elements while >>> checking the bound. I'd actually argue that such would be a bug. >>> >>> >>> On Fri, Dec 20, 2013 at 4:09 PM, Kevin Ballard <ke...@sb.org> wrote: >>> >>>> I haven’t profiled it, but my belief is that under normal >>>> circumstances, messages come in slow enough that the consumer is always >>>> idle and ready to process the next message as soon as it’s sent. However, I >>>> expect it does occasionally back up a bit, e.g. when I get a burst of >>>> traffic such as during a netsplit when I’m sent a large batch of “<user> >>>> has quit” or “<user> has joined” (when the netsplit is over). I don’t know >>>> how much the channel backs up at that point, probably not too much. >>>> >>>> For this particular use-case, a channel that’s bounded at e.g. 100,000 >>>> elements would be indistinguishable from an infinite channel, as long as it >>>> still dynamically allocates (I don’t *think* Go channels dynamically >>>> allocate, which is why I can’t just use a 100,000 element channel for >>>> real). >>>> >>>> However, my overall point about large bounds being indistinguishable >>>> from infinite is that if your goal is to pick a bound large enough to >>>> appear infinite to the program, without actually risking OOM, then there’s >>>> no automated way to do this. Different environments have differing amounts >>>> of available resources, and there’s no good way to pick a bound that is >>>> sufficiently high but is definitively lower than the resource bounds. This >>>> is why I’m recommending that we have truly infinite channels, for users who >>>> don’t want to have to think about bounds (e.g. my irc program), as well as >>>> bounded channels, where the user has to explicitly pick a bound (with no >>>> “default” provided). >>>> >>>> -Kevin >>>> >>>> On Dec 20, 2013, at 12:55 PM, Carter Schonwald < >>>> carter.schonw...@gmail.com> wrote: >>>> >>>> kevin, what sort of applications and workloads are you speaking about. >>>> Eg in your example irc server, whats the typical workload when you've used >>>> it? >>>> >>>> cheers >>>> -Carter >>>> >>>> >>>> On Fri, Dec 20, 2013 at 12:54 PM, Kevin Ballard <ke...@sb.org> wrote: >>>> >>>>> On Dec 20, 2013, at 8:59 AM, Carter Schonwald < >>>>> carter.schonw...@gmail.com> wrote: >>>>> >>>>> agreed! Applications that lack explicit logic for handling heavy >>>>> workloads (ie producers outpacing consumers for a sustained period) are >>>>> the >>>>> most common culprit for unresponsive desktop applications that become >>>>> completely unusable. >>>>> >>>>> >>>>> That’s a pretty strong claim, and one I would have to disagree with >>>>> quite strongly. Every time I’ve sampled an unresponsive application, I >>>>> don’t think I’ve *ever* seen a backtrace that suggests a producer >>>>> outpacing a consumer. >>>>> >>>>> -Kevin >>>>> >>>>> relatedly: would not bounded but programmatically growable channels >>>>> also make it trivial to provide a "unbounded" style channel abstraction? >>>>> (not that i'm advocating that, merely that it seems like it would turn the >>>>> unbounded channel abstraction into an equivalent one that is resource >>>>> usage >>>>> aware) >>>>> >>>>> >>>>> On Fri, Dec 20, 2013 at 8:52 AM, György Andrasek <jur...@gmail.com>wrote: >>>>> >>>>>> On 12/19/2013 11:13 PM, Tony Arcieri wrote: >>>>>> >>>>>>> So I think that entire line of reasoning is a red herring. People >>>>>>> writing toy programs that never have their channels fill beyond a >>>>>>> small >>>>>>> number of messages won't care either way. >>>>>>> >>>>>>> However, overloaded programs + queues bounded by system resources >>>>>>> are a >>>>>>> production outage waiting to happen. What's really important here is >>>>>>> providing a means of backpressure so overloaded Rust programs don't >>>>>>> grow >>>>>>> until they consume system resources and OOM. >>>>>>> >>>>>> >>>>>> While I disagree with the notion that all programs which don't have >>>>>> their bottlenecks right here are "toys", we should definitely strive for >>>>>> the invariant that task failure does not cause independent tasks to fail. >>>>>> >>>>>> Also, OOM is not free. If you manage to go OOM on a desktop, you'll >>>>>> get a *very* unhappy user, regardless of their expectations wrt your >>>>>> memory >>>>>> usage. Linux with a spinning disk and swap for example will degrade to >>>>>> the >>>>>> point where they'll reboot before the OOM killer kicks in. >>>>>> >>>>>> Can we PLEASE not do that *by default*? >>>>>> >>>>>> _______________________________________________ >>>>>> Rust-dev mailing list >>>>>> Rust-dev@mozilla.org >>>>>> https://mail.mozilla.org/listinfo/rust-dev >>>>>> >>>>> >>>>> _______________________________________________ >>>>> Rust-dev mailing list >>>>> Rust-dev@mozilla.org >>>>> https://mail.mozilla.org/listinfo/rust-dev >>>>> >>>>> >>>>> >>>> >>>> >>> >> >> _______________________________________________ >> Rust-dev mailing list >> Rust-dev@mozilla.org >> https://mail.mozilla.org/listinfo/rust-dev >> >> > > _______________________________________________ > Rust-dev mailing list > Rust-dev@mozilla.org > https://mail.mozilla.org/listinfo/rust-dev > >
_______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev