FWIW writing to a channel non-blockingly works like this:

select {
case ch <- v:
default:
}

If no communication can proceed (i.e. the write would block) the default
case is chosen.

On Mon, Jul 5, 2021 at 1:09 PM Erman İmer <ermani...@gmail.com> wrote:

> Thank you! I was confused about the highlighted part "For a channel used
> for notification of *just one* signal value, a buffer of size 1 is
> sufficient.*" *But I am convinced after realizing the single read on the
> 289th line. I will also spend some time understanding how Notify writes
> signals non-blockingly.
>
> Best regards
>
> On Mon, Jul 5, 2021 at 2:01 PM 'Axel Wagner' via golang-nuts <
> golang-nuts@googlegroups.com> wrote:
>
>> The documentation <https://golang.org/pkg/os/signal/#Notify> is actually
>> very specific here:
>>
>> Package signal will not block sending to c: the caller must ensure that c
>>> has sufficient buffer space to keep up with the expected signal rate. *For
>>> a channel used for notification of just one signal value, a buffer of size
>>> 1 is sufficient.*
>>
>>
>> (emphasis mine). This is exactly such a case. We only need one signal
>> value to know the context is cancelled.
>>
>> On Mon, Jul 5, 2021 at 12:55 PM Axel Wagner <
>> axel.wagner...@googlemail.com> wrote:
>>
>>> On Mon, Jul 5, 2021 at 12:41 PM Erman İmer <ermani...@gmail.com> wrote:
>>>
>>>> I think it is not about the context's cancellation. The signal channel
>>>> should have a sufficient buffer size.
>>>>
>>>
>>> 1 is a sufficient buffer size. Note that there is *exactly one* read
>>> from c.ch in
>>>
>>> https://github.com/golang/go/blob/912f0750472dd4f674b69ca1616bfaf377af1805/src/os/signal/signal.go#L287
>>> Therefore, even if the buffer was larger, any extra buffered signals
>>> would never be read. So the only possible point to having a larger buffer
>>> would be to prevent a writer from blocking on writing to it.
>>>
>>> However, as the documentation you are quoting is pointing out, `Notify`
>>> (the only writer to that channel) writes the signal non-blockingly.
>>> Therefore, there is never any danger of `Notify` getting blocked. The
>>> sentence you are quoting (making sure there is enough buffer size) is there
>>> to assure you have enough buffer space for a signal to get delivered - not
>>> to prevent `Notify` from blocking.
>>>
>>> Lastly, even *if* we needed more buffer space, your assumption that we
>>> need as much buffer space as there are signals is wrong. A single signal
>>> can be caught multiple times. So *if* we needed to be able to handle
>>> multiple signals (we don't - again, there is only one read, which is the
>>> one cancelling the context), we would also take into account that aspect.
>>> And there just is no actually correct size of the buffer, to make sure
>>> *all* signals get delivered - the number of signals that can happen before
>>> a reader is ready is unbounded.
>>>
>>> The code as it is currently is correct.
>>>
>>>
>>>
>>>
>>>>
>>>> Please check the former discussion which determined the Notify
>>>> function's description.
>>>> https://github.com/dominikh/go-staticcheck/issues/30
>>>>
>>>> Best regards
>>>>
>>>> On Mon, Jul 5, 2021 at 1:28 PM Sean Liao <seankhl...@gmail.com> wrote:
>>>>
>>>>> What problem are you trying to solve?
>>>>> It only makes sense for NotifyContext to receive a single signal since
>>>>> a context can only be cancelled once
>>>>>
>>>>> On Monday, July 5, 2021 at 10:17:49 AM UTC+2 erma...@gmail.com wrote:
>>>>>
>>>>>> Sorry about the broken link, here is the line:
>>>>>>
>>>>>> https://github.com/golang/go/blob/912f0750472dd4f674b69ca1616bfaf377af1805/src/os/signal/signal.go#L284
>>>>>>
>>>>>> On Monday, July 5, 2021 at 11:15:11 AM UTC+3 erma...@gmail.com wrote:
>>>>>>
>>>>>>> Hello,
>>>>>>>
>>>>>>> I have an improvement idea for the following line in the os/signals
>>>>>>> package.
>>>>>>>
>>>>>>> 284 c.ch = make(chan os.Signal, 1)
>>>>>>>
>>>>>>> Regarding the underlying function's (Notify) description ("the
>>>>>>> caller must ensure that channel has sufficient buffer space to keep up 
>>>>>>> with
>>>>>>> the expected signal rate.") the code can be improved like the following
>>>>>>> code snippet:
>>>>>>>
>>>>>>> cap := len(signals)
>>>>>>> if cap == 0 {
>>>>>>>     cap = 1
>>>>>>> }
>>>>>>> c.ch = make(chan os.Signal, cap)
>>>>>>>
>>>>>>> I wanted to discuss here first before opening my first issue :)
>>>>>>>
>>>>>>> Best regards
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>> You received this message because you are subscribed to a topic in the
>>>>> Google Groups "golang-nuts" group.
>>>>> To unsubscribe from this topic, visit
>>>>> https://groups.google.com/d/topic/golang-nuts/PpUBZ1hxBbM/unsubscribe.
>>>>> To unsubscribe from this group and all its topics, 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/c1cd6bd9-5307-4a71-9caa-f13c354185ccn%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/golang-nuts/c1cd6bd9-5307-4a71-9caa-f13c354185ccn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>
>>>>
>>>> --
>>>> *Erman İmer*
>>>>
>>>> --
>>>> 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/CAAYkT3MhFw3nmx6Fduv0wRiy10uC1un3whkwYN%2BVNbJPvtApfA%40mail.gmail.com
>>>> <https://groups.google.com/d/msgid/golang-nuts/CAAYkT3MhFw3nmx6Fduv0wRiy10uC1un3whkwYN%2BVNbJPvtApfA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "golang-nuts" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/golang-nuts/PpUBZ1hxBbM/unsubscribe.
>> To unsubscribe from this group and all its topics, 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/CAEkBMfGrMgVFTAVzZfcruB94rntR6nqWshOC%2Bg%2BTK6FAeaiogw%40mail.gmail.com
>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGrMgVFTAVzZfcruB94rntR6nqWshOC%2Bg%2BTK6FAeaiogw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> --
> *Erman İmer*
>

-- 
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/CAEkBMfHQ7q%3DTq0QJKS%2B%2Biagn6OrFEEu8%2BEpEK3QXuKSS9vaB6w%40mail.gmail.com.

Reply via email to