Write Events/Errors using select
howeyc opened this issue · 9 comments
This is a request that came up earlier that I almost forgot about. Creating issue so I remember.
Desire is to have the library send events/errors using select so that the receiving application can be monitoring the channels without the use of a separate goroutine.
What would this look like? Same channels/API just without requiring a goroutine?
Yes.
On Sep 4, 2013 12:14 PM, "Nathan Youngman" notifications@github.com wrote:
What would this look like? Same channels/API just without requiring a
goroutine?—
Reply to this email directly or view it on GitHubhttps://github.com//issues/7#issuecomment-23815989
.
Chime in for the os/notify API: http://goo.gl/MrYxyA
I'm not sure what makes this single thread unfriendly? Why can't I do something like:
func main() {
// create watcher
w.Add("./")
for {
select {
case <-w.Events:
// do stuff
case <-w.Errors:
// handle error
case <-sig:
// signal received, probably quit
}
}
}
See https://code.google.com/p/go/issues/detail?id=8282#c4 for one issue when using code very similar to what you presented.
If you want to take a closer look on multiple platforms, please report your findings at https://github.com/fsnotify/fsnotify/issues/new
Right. I suppose this is only an issue on some platforms (old linux? I saw some mentioning of the lowest linux denominator being too low to stop this from happening). Anyway, I'll run it in a separate goroutine for the time being and monitor this space. I'd love to be able to safely use it in single-threaded mode. As it stands, it's not very obvious one needs to do this goroutine trick. Thanks for the update!
At GopherCon India last month, Alan Shreve gave a talk on Principles of designing Go APIs with channels which i thought might be relevant for this issue in FSNotify since I too had to puzzle through the sources to check if it's using blocking channels... Specifically An API that sends an unbounded stream of values into a channel must document how it behaves for slow consumers
@srinathh Thanks for the tip. Now that the videos are up, I'll be sure to watch that talk.
Is this still an issue? golang/go#8282 (comment)
If so, what would be the non-racey way of doing this?