You deserve extra credit for getting the phrase "ouroboros data structure"
in there. ;-)

On Thu, Jan 31, 2019 at 10:20 AM roger peppe <rogpe...@gmail.com> wrote:

> On Thu, 31 Jan 2019 at 16:22, Michael Jones <michael.jo...@gmail.com>
> wrote:
>
>> Agree. I’ve never had that level of imbalance but yes.
>>
>
> When doing mathematical calculations, as I think your code was, I think
> it's usual to have comparable costs for each item. By contrast, I'm usually
> adding this kind of code to make concurrent network requests, and in that
> scenario it's much more likely that some requests are orders of magnitude
> slower than others.
>
> FWIW I was quite pleased with the `chan chan R` idea - I might use it for
> real some time :) Come to think of it, it's slightly reminiscent of another
> pattern I wrote about some years ago:
> https://rogpeppe.wordpress.com/2009/12/01/concurrent-idioms-1-broadcasting-values-in-go-with-linked-channels/
>
>   cheers,
>     rog.
>
>
>> On Thu, Jan 31, 2019 at 4:06 AM roger peppe <rogpe...@gmail.com> wrote:
>>
>>> On Thu, 31 Jan 2019 at 00:06, Michael Jones <michael.jo...@gmail.com>
>>> wrote:
>>>
>>>> note that my code sidesteps this problem generally
>>>>
>>>
>>> I'm not sure that that's true. Although your code mitigates the problem
>>> somewhat,
>>> it's still possible for a one slow worker to block the others. You've
>>> added 512*NumCPU/2
>>> buffer slots, but in general it's not possible to order results and
>>> provide avoid unnecessary
>>> blocking without having N buffer slots. In your code, assume 4 CPUs and
>>> that work items 0
>>> and 2 take 1s and all other work items take 1ms. If we've got 5000 items
>>> in total,
>>> the total time taken will be 2.002498s instead of the ideal time
>>> (~1s+2499µs).
>>>
>>> https://play.golang.org/p/5Ty6pgpmZ0w
>>>
>>> Here's a kind of hybrid approach. It still serializes, but it makes as
>>> good a use of the buffer
>>> space as it can - it won't block until a slow item is at least bufSize
>>> items behind the
>>> most recently processed item:
>>>
>>> https://play.golang.org/p/PP9NSJuLeEK
>>>
>>>
>>>> On Wed, Jan 30, 2019 at 3:48 PM roger peppe <rogpe...@gmail.com> wrote:
>>>>
>>>>> On Wed, 30 Jan 2019 at 20:07, 'Bryan Mills' via golang-nuts <
>>>>> golang-nuts@googlegroups.com> wrote:
>>>>>
>>>>>> The code to sequence the results using a channel is not much more
>>>>>> verbose.
>>>>>>
>>>>>> That not only avoids the library dependency, but also makes the peak
>>>>>> memory consumption for the results O(runtime.NumCPU()), instead of O(N)
>>>>>> with the number of tasks, and allows the output to be streamed instead of
>>>>>> buffered to a slice.
>>>>>>
>>>>>> https://play.golang.org/p/zkBjxlcvESe
>>>>>>
>>>>>
>>>>> Nice! In practice though, I've usually found that I do want to keep
>>>>> the results around or I don't care about the order at all, so the parallel
>>>>> package works OK.
>>>>>
>>>>> I'd point out one down side to the sequencing approach - one very slow
>>>>> work item can block the others. For example, NProc is 4, the first item
>>>>> takes 200 milliseconds to process and all the others take 1 millisecond,
>>>>> then the first 4 workers have started, none more will be started until the
>>>>> first has, so the overall time will be quite a bit longer (249ms) than if
>>>>> they were all allowed to proceed irrespective of order (200ms).
>>>>>
>>>>> --
>>>>> 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.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> *Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*
>>>>
>>> --
>>
>> *Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*
>>
>

-- 

*Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to