I still no get the idea behind your requirement, in your example you 
calling the web service 6 times in sequential manner and then write it to 
the channel.
But again you can only write once to a channel with a capacity of one, as 
long as you not read from the same channel and you still read it in the 
select statement.
That means all other calls to 'GetPartWebServiceData()' in the goroutine 
are blocked until that read in the select statement happens. In your case 
it is always the first
value written to the channel.

I try to give you a solution with although i'm not completely understand 
your requirements:

Here a working sequential solution: https://play.golang.org/p/2qohwIjP96

I hope that helps

Cheers snmed

Am Sonntag, 6. August 2017 13:05:11 UTC+2 schrieb Abhijit Desai:
>
> Requirement is to collect the data with in cuttoff time say 3 sec by 
> invoking web service multiple times and return only latest invoked data
>
> c1 <- "result 1" // In real scenario this taking almost 1 seconds as in 
> real scenario it's taking Part chunk of data from Web Service
>
> Something like... Expecting data from c1 <- GetPartWebServiceData("request 
> 3") //at least I should get this data!?
>
>
> package main
>
> import "time"
> import "fmt"
>
> func main() {
>
>     c1 := make(chan string, 1)
>     
>     go func() {
>   
>         c1 <- GetPartWebServiceData("request 1") //say try 6 times
>         c1 <- GetPartWebServiceData("request 2")
>         c1 <- GetPartWebServiceData("request 3") //at least I should get 
> this data!?
>         c1 <- GetPartWebServiceData("request 4")
>         c1 <- GetPartWebServiceData("request 5")
>         c1 <- GetPartWebServiceData("request 6")
>     }()
>
>         select {
>             case res := <-c1: //here program get out without waiting 3 
> seconds because it got the data
>                 fmt.Println(res)
>             case <-time.After(time.Second * 4):
>                 fmt.Println("timeout")
>         }
> }
>
> func GetPartWebServiceData(request string) string{
>     time.Sleep(time.Second * 1) // Time Consuming work returning part value
>     partResponse := "Response for " + request  //some response
>     return partResponse
> }
>
>
>
> On Sunday, August 6, 2017 at 4:03:08 PM UTC+5:30, snmed wrote:
>>
>> Hi 
>>
>> What are you trying to solve? Your channel has a capacity of 1, the first 
>> write to c1 is successful but the second write to c1 is blocked until it 
>> has been read in the select statement. And therefore you print the first 
>> value written to c1.
>>
>> I recommend you to read this 
>> https://golang.org/doc/effective_go.html#channels documentation about 
>> channels.
>>
>> Cheers snmed
>>
>>

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