forked from thrasher-corp/gocryptotrader
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
alert: Add optimizations (thrasher-corp#939)
* alert: Add optimizations * alert: add basic benchmarks * alert: fix linter issue * documentation: change to text/template as html/template escapes to protect against code injection. Add readme.md for alert. * README: Add package name * alert: link up with engine settings * request: isVerbose refactor * Update exchanges/alert/alert_test.go Co-authored-by: Scott <[email protected]> * Update exchanges/alert/alert.go Co-authored-by: Scott <[email protected]> * glorious: nits * glorious: fun police * documentation: regen Co-authored-by: Ryan O'Hara-Reid <[email protected]> Co-authored-by: Scott <[email protected]>
- Loading branch information
1 parent
1736c1e
commit 68db415
Showing
11 changed files
with
413 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
{{define "exchanges alert" -}} | ||
{{template "header" .}} | ||
## Alert | ||
|
||
+ This package allows for multiple routines to wait for a state change on any required data. | ||
|
||
### Examples: | ||
|
||
+ Implementation: | ||
|
||
```go | ||
// SomeChangingType defines an example struct with an embedded alert.Notice | ||
// type for easy access to the notice methods. | ||
type SomeChangingType struct { | ||
ValueThatChanges int64 | ||
alert.Notice | ||
mu sync.Mutex // Protection for routine shenanigans | ||
} | ||
|
||
// Update will update in a separate routine | ||
func (s *SomeChangingType) Update(newValue int64) { | ||
// This simulates a changing variable or state | ||
s.mu.Lock() | ||
s.ValueThatChanges = newValue | ||
// This will alert any routines that are currently waiting for a change | ||
s.Alert() | ||
s.mu.Unlock() | ||
} | ||
|
||
// WhatsTheValue will retrieve the value that was changed and should be | ||
// different from the past value. Efficiency++ | ||
func (s *SomeChangingType) WhatsTheValue() int64 { | ||
s.mu.Lock() | ||
value := s.ValueThatChanges | ||
s.mu.Unlock() | ||
return value | ||
} | ||
``` | ||
|
||
+ Routine waiting for change: | ||
|
||
```go | ||
// ExampleRoutineThatWaits defines an exchange potential routine that will wait | ||
// for an impending change. | ||
func ExampleRoutineThatWaits(potentialChange *SomeChangingType) { | ||
// Every iteration requires a Wait() call. | ||
for range potentialChange.Wait(nil) { | ||
val := potentialChange.WhatsTheValue() | ||
fmt.Println("Value:", val) | ||
} | ||
} | ||
|
||
// AnotherExampleRoutineThatWaits defines an exchange potential routine that | ||
// will wait for an impending change. | ||
func AnotherExampleRoutineThatWaits(potentialChange *SomeChangingType) { | ||
// Every iteration requires a Wait() call. | ||
for { | ||
select { | ||
case <-potentialChange.Wait(nil): | ||
val := potentialChange.WhatsTheValue() | ||
fmt.Println("Value:", val) | ||
case <-shutdownChannel: | ||
fmt.Println("Good-Bye!") | ||
return | ||
} | ||
} | ||
} | ||
|
||
|
||
// WARNING: PLEASE DON'T DO THIS. | ||
// This will stop alerting for this specific data type due to the shared nature | ||
// of the underlying channels using a sync.Pool. | ||
func ABadExampleRoutineThatWaits(potentialChange *SomeChangingType) { | ||
capturedChannel := potentialChange.Wait(nil) | ||
for { | ||
select { | ||
case <-capturedChannel: | ||
// This will produce incorrect results or no change. | ||
val := potentialChange.WhatsTheValue() | ||
fmt.Println("Value:", val) | ||
case <-shutdownChannel: | ||
fmt.Println("Good-Bye!") | ||
return | ||
} | ||
} | ||
} | ||
``` | ||
|
||
### Please click GoDocs chevron above to view current GoDoc information for this package | ||
{{template "contributions"}} | ||
{{template "donations" .}} | ||
{{end}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
# GoCryptoTrader package Alert | ||
|
||
<img src="/common/gctlogo.png?raw=true" width="350px" height="350px" hspace="70"> | ||
|
||
|
||
[![Build Status](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml) | ||
[![Software License](https://img.shields.io/badge/License-MIT-orange.svg?style=flat-square)](https://github.com/thrasher-corp/gocryptotrader/blob/master/LICENSE) | ||
[![GoDoc](https://godoc.org/github.com/thrasher-corp/gocryptotrader?status.svg)](https://godoc.org/github.com/thrasher-corp/gocryptotrader/exchanges/alert) | ||
[![Coverage Status](http://codecov.io/github/thrasher-corp/gocryptotrader/coverage.svg?branch=master)](http://codecov.io/github/thrasher-corp/gocryptotrader?branch=master) | ||
[![Go Report Card](https://goreportcard.com/badge/github.com/thrasher-corp/gocryptotrader)](https://goreportcard.com/report/github.com/thrasher-corp/gocryptotrader) | ||
|
||
|
||
This alert package is part of the GoCryptoTrader codebase. | ||
|
||
## This is still in active development | ||
|
||
You can track ideas, planned features and what's in progress on this Trello board: [https://trello.com/b/ZAhMhpOy/gocryptotrader](https://trello.com/b/ZAhMhpOy/gocryptotrader). | ||
|
||
Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader Slack](https://join.slack.com/t/gocryptotrader/shared_invite/enQtNTQ5NDAxMjA2Mjc5LTc5ZDE1ZTNiOGM3ZGMyMmY1NTAxYWZhODE0MWM5N2JlZDk1NDU0YTViYzk4NTk3OTRiMDQzNGQ1YTc4YmRlMTk) | ||
|
||
## Alert | ||
|
||
+ This package allows for multiple routines to wait for a state change on any required data. | ||
|
||
### Examples: | ||
|
||
+ Implementation: | ||
|
||
```go | ||
// SomeChangingType defines an example struct with an embedded alert.Notice | ||
// type for easy access to the notice methods. | ||
type SomeChangingType struct { | ||
ValueThatChanges int64 | ||
alert.Notice | ||
mu sync.Mutex // Protection for routine shenanigans | ||
} | ||
|
||
// Update will update in a separate routine | ||
func (s *SomeChangingType) Update(newValue int64) { | ||
// This simulates a changing variable or state | ||
s.mu.Lock() | ||
s.ValueThatChanges = newValue | ||
// This will alert any routines that are currently waiting for a change | ||
s.Alert() | ||
s.mu.Unlock() | ||
} | ||
|
||
// WhatsTheValue will retrieve the value that was changed and should be | ||
// different from the past value. Efficiency++ | ||
func (s *SomeChangingType) WhatsTheValue() int64 { | ||
s.mu.Lock() | ||
value := s.ValueThatChanges | ||
s.mu.Unlock() | ||
return value | ||
} | ||
``` | ||
|
||
+ Routine waiting for change: | ||
|
||
```go | ||
// ExampleRoutineThatWaits defines an exchange potential routine that will wait | ||
// for an impending change. | ||
func ExampleRoutineThatWaits(potentialChange *SomeChangingType) { | ||
// Every iteration requires a Wait() call. | ||
for range potentialChange.Wait(nil) { | ||
val := potentialChange.WhatsTheValue() | ||
fmt.Println("Value:", val) | ||
} | ||
} | ||
|
||
// AnotherExampleRoutineThatWaits defines an exchange potential routine that | ||
// will wait for an impending change. | ||
func AnotherExampleRoutineThatWaits(potentialChange *SomeChangingType) { | ||
// Every iteration requires a Wait() call. | ||
for { | ||
select { | ||
case <-potentialChange.Wait(nil): | ||
val := potentialChange.WhatsTheValue() | ||
fmt.Println("Value:", val) | ||
case <-shutdownChannel: | ||
fmt.Println("Good-Bye!") | ||
return | ||
} | ||
} | ||
} | ||
|
||
|
||
// WARNING: PLEASE DON'T DO THIS. | ||
// This will stop alerting for this specific data type due to the shared nature | ||
// of the underlying channels using a sync.Pool. | ||
func ABadExampleRoutineThatWaits(potentialChange *SomeChangingType) { | ||
capturedChannel := potentialChange.Wait(nil) | ||
for { | ||
select { | ||
case <-capturedChannel: | ||
// This will produce incorrect results or no change. | ||
val := potentialChange.WhatsTheValue() | ||
fmt.Println("Value:", val) | ||
case <-shutdownChannel: | ||
fmt.Println("Good-Bye!") | ||
return | ||
} | ||
} | ||
} | ||
``` | ||
|
||
### Please click GoDocs chevron above to view current GoDoc information for this package | ||
|
||
## Contribution | ||
|
||
Please feel free to submit any pull requests or suggest any desired features to be added. | ||
|
||
When submitting a PR, please abide by our coding guidelines: | ||
|
||
+ Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). | ||
+ Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. | ||
+ Code must adhere to our [coding style](https://github.com/thrasher-corp/gocryptotrader/blob/master/doc/coding_style.md). | ||
+ Pull requests need to be based on and opened against the `master` branch. | ||
|
||
## Donations | ||
|
||
<img src="https://github.com/thrasher-corp/gocryptotrader/blob/master/web/src/assets/donate.png?raw=true" hspace="70"> | ||
|
||
If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to: | ||
|
||
***bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc*** |
Oops, something went wrong.