On Saturday, August 31, 2019 at 9:49:56 PM UTC-4, Robert Engels wrote:
>
> Yes, that is why the original code did not use a lock on the read but the 
> read of the flag was wrong. The version I posted in the other thread works 
> fine locally. time.Sleep() has problems in the playground 
>

You mean this one: https://play.golang.org/p/JRSEPU3Uf17 ?
No no, it is not a good ideas to use mutex in write but atomic in read to 
avoid concurrently accessing the same value.
 

>
> On Aug 31, 2019, at 7:50 AM, T L <tapi...@gmail.com <javascript:>> wrote:
>
>
>
> On Saturday, August 31, 2019 at 8:24:31 AM UTC-4, Robert Engels wrote:
>>
>> If you comment out the read method then all threads will block. That is 
>> the the behavior of an unbuffered channel - a writer blocks until a reader 
>> is ready. Which is why you always need a valid reader running. Unless the 
>> channel is closed and then the writer will panic. 
>>
>> The code I provided is valid. 
>>
>
> In fact, if I comment out the write instead read part, the code will also 
> crash on all goroutines are blocked.
>  
>
>>
>> On Aug 31, 2019, at 2:40 AM, T L <tapi...@gmail.com> wrote:
>>
>>
>>
>> On Friday, August 30, 2019 at 1:40:33 PM UTC-4, Robert Engels wrote:
>>>
>>> You changed the Read() method incorrectly - it should be using the Read 
>>> lock, not the Write lock.
>>>
>>> Still, as I pointed out when I posted it, Play has a problem where it 
>>> aborts if all routines are sleeping (not just blocked), so you need to run 
>>> it locally.
>>>
>>
>> My fault. But it doesn't matter, for the Read method is never called (I 
>> commented it off).
>> It also crash locally for all goroutines are blocked.
>>  
>>
>>> -----Original Message----- 
>>> From: T L 
>>> Sent: Aug 30, 2019 12:05 PM 
>>> To: golang-nuts 
>>> Subject: Re: [go-nuts] An old problem: lack of priority select cases 
>>>
>>>
>>>
>>> On Friday, August 30, 2019 at 12:39:41 PM UTC-4, Robert Engels wrote:
>>>>
>>>>
>>>> Makes no difference in the code I posted.... as long as they all use 
>>>> the same MultiWriterChannel. In fact, others can be late started, as they 
>>>> will fail fast if the channel is already closed.
>>>>
>>>
>>> https://play.golang.org/p/pcwIu2w8ZRb
>>>
>>> All go routines are blocked in the modified version.
>>>  
>>>
>>>> -----Original Message----- 
>>>> From: T L 
>>>> Sent: Aug 30, 2019 11:13 AM 
>>>> To: golang-nuts 
>>>> Subject: Re: [go-nuts] An old problem: lack of priority select cases 
>>>>
>>>>
>>>>
>>>> On Friday, August 30, 2019 at 10:35:29 AM UTC-4, Robert Engels wrote:
>>>>>
>>>>> I don't think so. Why do you think that is the case? The RWLock is 
>>>>> "fair" in the sense that once the 'closer' attempts to get the lock, it 
>>>>> is 
>>>>> guaranteed to get it (as the code is structured) - the subsequent readers 
>>>>> will queue behind the "writer = closer".
>>>>>
>>>>
>>>> How about unknown/random number of senders and readers?
>>>>  
>>>>
>>>>>
>>>>> -----Original Message----- 
>>>>> From: T L 
>>>>> Sent: Aug 30, 2019 8:50 AM 
>>>>> To: golang-nuts 
>>>>> Subject: Re: [go-nuts] An old problem: lack of priority select cases 
>>>>>
>>>>> @Robert 
>>>>> I think there is a difference between the code of @Leo and you.
>>>>> In you code, the Wirte/Read/Close are all possible to block for ever.
>>>>>
>>>>> On Thursday, August 29, 2019 at 8:59:10 PM UTC-4, Robert Engels wrote:
>>>>>>
>>>>>>
>>>>>> Oops. You are right. The original used two different methods Closed() 
>>>>>> and Read() and when I refactored I forgot to add the Read lock to the 
>>>>>> Read(). That's why you always have code reviews...
>>>>>>
>>>>>> -----Original Message----- 
>>>>>> From: T L 
>>>>>> Sent: Aug 29, 2019 6:25 PM 
>>>>>> To: golang-nuts 
>>>>>> Subject: Re: [go-nuts] An old problem: lack of priority select cases 
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Wednesday, August 28, 2019 at 10:05:06 PM UTC-4, robert engels 
>>>>>> wrote:
>>>>>>>
>>>>>>> Here is a version using RWLock https://play.golang.org/p/YOwuYFiqtlf
>>>>>>>
>>>>>>
>>>>>> Doesn't the Read method need to be guarded by the reader lock?
>>>>>>
>>>>>>  
>>>>>>
>>>>>>>
>>>>>>> It won’t run correctly in the playground because it terminates when 
>>>>>>> all routines are asleep - which happens during the test (not sure why 
>>>>>>> it 
>>>>>>> does this, as sleeping is different than a deadlock).
>>>>>>>
>>>>>>> It is probably less efficient, and less orderly than the other 
>>>>>>> example using WaitGroup but you get the idea I hope. It forcibly 
>>>>>>> terminates 
>>>>>>> the writers before they complete by design.
>>>>>>>
>>>>>>> On Aug 28, 2019, at 4:09 PM, Michel Levieux <m.le...@capitaldata.fr> 
>>>>>>> wrote:
>>>>>>>
>>>>>>> One should also be careful regarding the conceptual demands he or 
>>>>>>> she is making.
>>>>>>> Having a shared resource (that is complex enough that it cannot be 
>>>>>>> atomically accessed or modified) means essentially that "having 
>>>>>>> multiple 
>>>>>>> writers being transparent to the readers", fundamentally, is not 
>>>>>>> possible.
>>>>>>>
>>>>>>> From the moment itself when such a resource is shared, there must be 
>>>>>>> some sort of mecanism (that one using resources atomically usable) that 
>>>>>>> ensures the integrity of it.
>>>>>>> Maybe what you're talking about is having it transparent in terms of 
>>>>>>> code, in which case we both agree, but if you're looking for something 
>>>>>>> transparent in essence, as in performance, logical construction and all 
>>>>>>> the 
>>>>>>> rest, I think there is a misunderstanding here: even if it was added in 
>>>>>>> the 
>>>>>>> language, there would be many many things going on under the hood, as 
>>>>>>> it is 
>>>>>>> already (and cannot really be otherwise) for channel use alone.
>>>>>>>
>>>>>>> As for the priority using selects, I think it's more of something to 
>>>>>>> be dealt with on the "user-side". There are many kinds of priority in 
>>>>>>> general, and trying to implement something in the language itself would 
>>>>>>> IMO 
>>>>>>> either be too specific compared to the nessecary time to do so or it 
>>>>>>> would 
>>>>>>> probably have a huge overhead on the "classical' use case of the select 
>>>>>>> construct.
>>>>>>> + the fact that it is apparently already possible using RWMutexes.
>>>>>>>
>>>>>>> Le mer. 28 août 2019 à 22:37, Marcin Romaszewicz <mar...@gmail.com> 
>>>>>>> a écrit :
>>>>>>>
>>>>>>>> Think of a channel as existing for the lifetime of a particular 
>>>>>>>> data stream, and not have it be associated with either producer or 
>>>>>>>> consumer. Here's an example:
>>>>>>>>
>>>>>>>> https://play.golang.org/p/aEAXXtz2X1g
>>>>>>>>
>>>>>>>> The channel here is closed after all producers have exited, and all 
>>>>>>>> consumers continue to run until the channel is drained of data.
>>>>>>>>
>>>>>>>> The producers are managed by something somewhere in your code - and 
>>>>>>>> that is the scope at which it makes sense to create channel ownership. 
>>>>>>>> I've 
>>>>>>>> used a waitgroup to ensure that the channel is closed after all 
>>>>>>>> producers 
>>>>>>>> exit, but you can use whatever barrier construct you want.
>>>>>>>>
>>>>>>>> Even if you must have a channel per producer, you can safely close 
>>>>>>>> the producer side, without notifying the downstream about this. The 
>>>>>>>> example 
>>>>>>>> early in the thread uses multiple channels, with one channel being 
>>>>>>>> used to 
>>>>>>>> signal that the producers should exit. Channels aren't really the 
>>>>>>>> right 
>>>>>>>> model for this, you want a thread safe flag of some sort. For example:
>>>>>>>>
>>>>>>>> var exitFlag uint64
>>>>>>>> func producer(chan data int, wg *sync.WaitGroup) {
>>>>>>>>     defer wg.Done()
>>>>>>>>     for {
>>>>>>>>         shouldExit := atomic.LoadUint64(&exitFlag)
>>>>>>>>         if shouldExit == 1 {
>>>>>>>>              return
>>>>>>>>         }
>>>>>>>>         chan <- rand.Intn(100)
>>>>>>>>     }
>>>>>>>> }
>>>>>>>>
>>>>>>>> Here's 10 producers and 3 consumers sharing a channel and closing 
>>>>>>>> it safely upon receiving an exit flag:
>>>>>>>> https://play.golang.org/p/RiKi1PGVSvF
>>>>>>>>
>>>>>>>> -- Marcin
>>>>>>>>
>>>>>>>> On Wed, Aug 28, 2019 at 11:29 AM Leo Lara <l...@leopoldolara.com> 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> I do not think priority select is *necessary*, it could be a nice 
>>>>>>>>> addition if the performance does not change.
>>>>>>>>>
>>>>>>>>> On Wednesday, August 28, 2019 at 8:27:36 PM UTC+2, Leo Lara wrote:
>>>>>>>>>>
>>>>>>>>>> Hi Robert,
>>>>>>>>>>
>>>>>>>>>> From the article: """To bound more the problem, in my case, you 
>>>>>>>>>> control the writers but not the readers"""
>>>>>>>>>>
>>>>>>>>>> So what I was trying to do was to be able to close, with mutiple 
>>>>>>>>>> writers, while being transparent for the readers. The readers only 
>>>>>>>>>> need to 
>>>>>>>>>> read as usual form the channel.
>>>>>>>>>>
>>>>>>>>>> For example, if you want to write a library where the user just 
>>>>>>>>>> reads from a channel, this is an approach I found where the user of 
>>>>>>>>>> the 
>>>>>>>>>> lirbary deos nto have to do anything special. Of course, there might 
>>>>>>>>>> be 
>>>>>>>>>> another solution, but if you need to modify the reader we are 
>>>>>>>>>> talking about 
>>>>>>>>>> a different problem.
>>>>>>>>>>
>>>>>>>>>> Cheers!!
>>>>>>>>>>
>>>>>>>>>> On Wednesday, August 28, 2019 at 7:17:24 PM UTC+2, Robert Engels 
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> A better solution is to wrap the writes using a RWLock, grab the 
>>>>>>>>>>> read lock for writing, and the Write lock for closing. Pretty 
>>>>>>>>>>> simple.
>>>>>>>>>>>
>>>>>>>>>>> Just encapsulate it all in a MultiWriterChannel struct - 
>>>>>>>>>>> generics would help here :)
>>>>>>>>>>>
>>>>>>>>>>> -----Original Message----- 
>>>>>>>>>>> From: Leo Lara 
>>>>>>>>>>> Sent: Aug 28, 2019 11:24 AM 
>>>>>>>>>>> To: golang-nuts 
>>>>>>>>>>> Subject: [go-nuts] Re: An old problem: lack of priority select 
>>>>>>>>>>> cases 
>>>>>>>>>>>
>>>>>>>>>>> This is connected with my article: 
>>>>>>>>>>> https://dev.to/leolara/closing-a-go-channel-written-by-several-goroutines-52j2
>>>>>>>>>>>
>>>>>>>>>>> I think there I show it is possible to workaround that 
>>>>>>>>>>> limitation using standard Go tools. Of course, the code would be 
>>>>>>>>>>> simple 
>>>>>>>>>>> with priority select, but also perhaps select would become less 
>>>>>>>>>>> efficient.
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday, August 28, 2019 at 6:06:33 PM UTC+2, T L wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> The old thread: 
>>>>>>>>>>>> https://groups.google.com/forum/#!topic/golang-nuts/ZrVIhHCrR9o
>>>>>>>>>>>>
>>>>>>>>>>>> Go channels are flexible, but in practice, I often encountered 
>>>>>>>>>>>> some situations in which channel are hard to use.
>>>>>>>>>>>> Given an example:
>>>>>>>>>>>>
>>>>>>>>>>>> import "math/rand"
>>>>>>>>>>>>
>>>>>>>>>>>> type Producer struct {
>>>>>>>>>>>>     data   chan int
>>>>>>>>>>>>     closed chan struct{}
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> func NewProducer() *Producer {
>>>>>>>>>>>>     p := &Producer {
>>>>>>>>>>>>         data:   make(chan int),
>>>>>>>>>>>>         closed: make(chan struct{}),
>>>>>>>>>>>>     }
>>>>>>>>>>>>     
>>>>>>>>>>>>     go p.run()
>>>>>>>>>>>>     
>>>>>>>>>>>>     return p
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> func (p *Produce) Stream() chan int {
>>>>>>>>>>>>     return p.data
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> func (p *Producer) run() {
>>>>>>>>>>>>     for {
>>>>>>>>>>>>         // If non-blocking cases are selected by their 
>>>>>>>>>>>> appearance order,
>>>>>>>>>>>>         // then the following slect block is a perfect use.
>>>>>>>>>>>>         select {
>>>>>>>>>>>>         case(0) <-p.closed: return
>>>>>>>>>>>>         case p.data <- rand.Int():
>>>>>>>>>>>>         }
>>>>>>>>>>>>     }
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> func (p *Produce) Clsoe() {
>>>>>>>>>>>>     close(p.closed)
>>>>>>>>>>>>     close(p.data)
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> func main() {
>>>>>>>>>>>>     p := NewProducer()
>>>>>>>>>>>>     for n := p.Stream() {
>>>>>>>>>>>>         // use n ...
>>>>>>>>>>>>     }
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> If the first case in the select block in the above example has 
>>>>>>>>>>>> a higher priority than the second one,
>>>>>>>>>>>> then coding will be much happier for the use cases like the 
>>>>>>>>>>>> above one.
>>>>>>>>>>>>
>>>>>>>>>>>> In short, the above use case requires:
>>>>>>>>>>>> * for receivers, data streaming end is notified by the close of 
>>>>>>>>>>>> a channel.
>>>>>>>>>>>> * for senders, data will never be sent to closed channel.
>>>>>>>>>>>>
>>>>>>>>>>>> But, as Go 1 doesn't support priority select cases, it is much 
>>>>>>>>>>>> tedious to implement the code
>>>>>>>>>>>> satisfying the above listed requirements. The final 
>>>>>>>>>>>> implementation is often very ugly and inefficient.
>>>>>>>>>>>>
>>>>>>>>>>>> Does anyone else also experience the pain?
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> -- 
>>>>>>>>>>> You received this message because you are subscribed to the 
>>>>>>>>>>> Google Groups "golang-nuts" group.
>>>>>>>>>>> To unsubscribe from this group and stop receiving emails from 
>>>>>>>>>>> it, send an email to golan...@googlegroups.com.
>>>>>>>>>>> To view this discussion on the web visit 
>>>>>>>>>>> https://groups.google.com/d/msgid/golang-nuts/b284f880-034a-4721-8686-ef48d3e2c14c%40googlegroups.com
>>>>>>>>>>>  
>>>>>>>>>>> <https://groups.google.com/d/msgid/golang-nuts/b284f880-034a-4721-8686-ef48d3e2c14c%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>> .
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>>> Groups "golang-nuts" group.
>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>>> send an email to golan...@googlegroups.com.
>>>>>>>>> To view this discussion on the web visit 
>>>>>>>>> https://groups.google.com/d/msgid/golang-nuts/aeb38a0a-8268-42d7-a8eb-ce5ef01c5380%40googlegroups.com
>>>>>>>>>  
>>>>>>>>> <https://groups.google.com/d/msgid/golang-nuts/aeb38a0a-8268-42d7-a8eb-ce5ef01c5380%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>>
>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "golang-nuts" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>> send an email to golan...@googlegroups.com.
>>>>>>>> To view this discussion on the web visit 
>>>>>>>> https://groups.google.com/d/msgid/golang-nuts/CA%2Bv29LvcUhUvrZb_8AKYWj0A%2Bqd5LKBPmbz-RVBb%3DJn_gNZE6w%40mail.gmail.com
>>>>>>>>  
>>>>>>>> <https://groups.google.com/d/msgid/golang-nuts/CA%2Bv29LvcUhUvrZb_8AKYWj0A%2Bqd5LKBPmbz-RVBb%3DJn_gNZE6w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "golang-nuts" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to golan...@googlegroups.com.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/golang-nuts/CANgi337s1Low95QvqJUAOTsqcVji7uMQ_jr%3DFftpt2uMz5_XSQ%40mail.gmail.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/golang-nuts/CANgi337s1Low95QvqJUAOTsqcVji7uMQ_jr%3DFftpt2uMz5_XSQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "golang-nuts" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to golan...@googlegroups.com.
>>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/golang-nuts/a5cff3f8-cc1c-4719-9f2f-7b9c31086f6a%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/golang-nuts/a5cff3f8-cc1c-4719-9f2f-7b9c31086f6a%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "golang-nuts" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to golan...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/4bf95bb2-33ed-46ed-9436-48df1072914f%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/4bf95bb2-33ed-46ed-9436-48df1072914f%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "golang-nuts" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to golan...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/golang-nuts/d155dcf6-7c01-4f7e-b408-eef9903cd837%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/golang-nuts/d155dcf6-7c01-4f7e-b408-eef9903cd837%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>>
>>>>
>>>>
>>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to golan...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/74653e49-f374-4ac8-998e-fd874cdf6bd4%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/74653e49-f374-4ac8-998e-fd874cdf6bd4%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>>
>>>
>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golan...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/3d75a129-efee-402f-aafa-9fe76af4e789%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/3d75a129-efee-402f-aafa-9fe76af4e789%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golan...@googlegroups.com <javascript:>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/dfdf8905-f740-434c-a293-d801de4f71dc%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/dfdf8905-f740-434c-a293-d801de4f71dc%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/ffd06e6e-fb00-400e-ad5f-5f23d27025f7%40googlegroups.com.

Reply via email to