7
7
[ ![ Maintainability] ( https://api.codeclimate.com/v1/badges/72fe9626fb821fc70251/maintainability )] ( https://codeclimate.com/github/fillmore-labs/async-exp/maintainability )
8
8
[ ![ Go Report Card] ( https://goreportcard.com/badge/fillmore-labs.com/exp/async )] ( https://goreportcard.com/report/fillmore-labs.com/exp/async )
9
9
[ ![ License] ( https://img.shields.io/github/license/fillmore-labs/exp-async )] ( https://www.apache.org/licenses/LICENSE-2.0 )
10
+ [ ![ FOSSA Status] ( https://app.fossa.com/api/projects/git%2Bgithub.com%2Ffillmore-labs%2Fasync-exp.svg?type=shield&issueType=license )] ( https://app.fossa.com/projects/git%2Bgithub.com%2Ffillmore-labs%2Fasync-exp )
10
11
11
12
The ` async ` package provides interfaces and utilities for writing asynchronous code in Go.
12
13
13
14
## Motivation
14
15
15
- Futures and promises are constructs used for asynchronous and concurrent programming, allowing developers to work with
16
- values that may not be immediately available and can be evaluated in a different execution context.
17
-
18
- Go is known for its built-in concurrency features like goroutines and channels.
19
- The select statement further allows for efficient multiplexing and synchronization of multiple channels, thereby
20
- enabling developers to coordinate and orchestrate asynchronous operations effectively.
21
- Additionally, the context package offers a standardized way to manage cancellation, deadlines, and timeouts within
22
- concurrent and asynchronous code.
23
-
24
- On the other hand, Go's error handling mechanism, based on explicit error values returned from functions, provides a
25
- clear and concise way to handle errors.
26
-
27
- The purpose of this package is to provide a thin layer over channels which simplifies the integration of concurrent
28
- code while providing a cohesive strategy for handling asynchronous errors.
29
- By adhering to Go's standard conventions for asynchronous and concurrent code, as well as error propagation, this
30
- package aims to enhance developer productivity and code reliability in scenarios requiring asynchronous operations.
16
+ This is an experimental package which has a similar API as
17
+ [ fillmore-labs.com/promise] ( https://pkg.go.dev/fillmore-labs.com/promise ) , but is implemented with a structure instead.
31
18
32
19
## Usage
33
20
@@ -37,18 +24,19 @@ address (see [GetMyIP](#getmyip) for an example).
37
24
Now you can do
38
25
39
26
``` go
40
- ctx , cancel := context.WithTimeout (context.Background (), 5 *time.Second )
27
+ ctx , cancel := context.WithTimeout (context.Background (), 2 *time.Second )
41
28
defer cancel ()
42
29
43
- future := async.NewFutureAsync (func () (string , error ) {
44
- return getMyIP (ctx)
45
- })
30
+ query := func () (string , error ) {
31
+ return getMyIP (ctx) // Capture context with timeout
32
+ }
33
+ future := async.NewAsync (query)
46
34
```
47
35
48
36
and elsewhere in your program, even in a different goroutine
49
37
50
38
``` go
51
- if ip , err := future.Wait (ctx); err == nil {
39
+ if ip , err := future.Await (ctx); err == nil {
52
40
slog.Info (" Found IP" , " ip" , ip)
53
41
} else {
54
42
slog.Error (" Failed to fetch IP" , " error" , err)
@@ -77,27 +65,15 @@ func getMyIP(ctx context.Context) (string, error) {
77
65
}
78
66
defer func () { _ = resp.Body .Close () }()
79
67
80
- ipResponse := & struct {
68
+ ipResponse := struct {
81
69
Origin string ` json:"origin"`
82
70
}{}
71
+ err = json.NewDecoder (resp.Body ).Decode (&ipResponse)
83
72
84
- if err := json.NewDecoder (resp.Body ).Decode (ipResponse); err != nil {
85
- return " " , err
86
- }
87
-
88
- return ipResponse.Origin , nil
73
+ return ipResponse.Origin , err
89
74
}
90
75
```
91
76
92
- ## Concurrency Correctness
93
-
94
- When utilizing plain Go channels for concurrency, reasoning over the correctness of concurrent code becomes simpler
95
- compared to some other implementations of futures and promises.
96
- Channels provide a clear and explicit means of communication and synchronization between concurrent goroutines, making
97
- it easier to understand and reason about the flow of data and control in a concurrent program.
98
-
99
- Therefore, this library provides a straightforward and idiomatic approach to achieving concurrency correctness.
100
-
101
77
## Links
102
78
103
79
- [ Futures and Promises] ( https://en.wikipedia.org/wiki/Futures_and_promises ) in the English Wikipedia
0 commit comments