And technically they are not tracking goroutines but done things. Each
goroutine could each finish 10 things.

On Thu, 2 Nov 2017, 17:01 Andy Balholm, <andybalh...@gmail.com> wrote:

> You can add goroutines to a WaitGroup as you create them. There is nothing
> that keeps you from calling Add more than once.
>
> Andy
>
>
> On Nov 1, 2017, at 11:10 PM, kanth...@gmail.com wrote:
>
> I am new to Go and I had read numerous times in various articles that one
> can technically create any number of Go routines and the runtime takes care
> of them mapping to kernel threads. If so, why does waitGroup designed in a
> way such that one has to specify how many go routines one need to create
> ahead of time ? why can't waitGroup be more dynamic such that I can add a
> Goroutine to waitgroup once I create it ? To put the question in another
> way why are people even thinking about pool of go routines in the first
> place given that goroutines are user level threads? If someone talks about
> pool of goroutines I feel like I am back to C++ or any other language that
> creates pool of kernel threads. Does Go runtimes doesn't keep its promise?
> Again, I am new so please enlighten me.
>
> On Wednesday, June 29, 2016 at 3:35:31 PM UTC-7, Inspectre Gadget wrote:
>>
>> Hey everyone,
>>
>> Here’s my issue, I will try to keep this short and concise:
>>
>> I have written a program that will accept a URL, spider that URL’s domain
>> and scheme (http/https), and return back all input fields found throughout
>> to the console. The purpose is largely for web application security
>> testing, as input fields are the most common vulnerability entry points
>> (sinks), and this program automates that part of the reconnaissance phase.
>>
>> Here is the problematic code:
>> https://github.com/insp3ctre/input-field-finder/blob/ce7983bd336ad59b2e2b613868e49dfb44110d09/main.go
>>
>> The issue lies in the last for loop in the main() function. If you were
>> to run this program, it would check the queue and workers so frequently
>> that it is bound to find a point where there are both no workers working,
>> and no URLs in the queue (as proved by the console output statements before
>> it exits). Nevermind that the problem is exacerbated by network latency.
>> The number of URLs actually checked varies on every run, which causes some
>> serious inconsistencies, and prevents the program from being at all
>> reliable.
>>
>> The issue was fixed here:
>> https://github.com/insp3ctre/input-field-finder/blob/f0032bb550ced0b323e63be9c4f40d644257abcd/main.go
>>
>> I fixed it by removing all concurrency from network requests, leaving it
>> only in the internal HTML processing functions.
>>
>> So, the question is- how does one run efficient concurrent code when the
>> number of wait groups is dynamic, and unknown at program initialization?
>>
>> I have tried:
>>
>>    - Using “worker pools”, which consist of channels of workers. The for
>>    loop checks the length of the URL queue and the number of workers
>>    available. If the URL queue is empty and all the workers are available,
>>    then it exits the loop.
>>    - Dynamically adding wait groups (wg.Add(1)) every time I pull a URL
>>    from the URL queue. *I can’t set the wait group numbers before the
>>    loop, because I can never know how many URLs are going to be checked.*
>>
>>
>> So I have tried using both channels and wait groups to check alongside
>> the URL queue length to determine whether more concurrent network requests
>> are needed. In both cases, the for loop checks the values so fast that it
>> eventually stumbles upon a non-satisfied loop condition, and exits. This
>> usually results in either the program hanging as it waits for wait groups
>> to exit that never do, or it simply exits prematurely, as more URLs are
>> added to the queue after the fact.
>>
>> I would really like to know if there is a way to actually do this well in
>> Go.
>>
>> Cheers,
>>
>> Inspectre
>>
>
> --
> 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.
>
>
> --
> 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.
>

-- 
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