mirror of https://github.com/panjf2000/ants.git
commit
fc3f793a01
|
@ -11,7 +11,7 @@ body:
|
||||||
value: |
|
value: |
|
||||||
## Before you go any further
|
## Before you go any further
|
||||||
- Please read [<u>*How To Ask Questions The Smart Way*</u>](http://www.catb.org/~esr/faqs/smart-questions.html) ( Chinese translation: [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)) before you file an issue formally.
|
- Please read [<u>*How To Ask Questions The Smart Way*</u>](http://www.catb.org/~esr/faqs/smart-questions.html) ( Chinese translation: [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)) before you file an issue formally.
|
||||||
- Keep in mind that there is always welcome to ask questions on [Gitter](https://gitter.im/ants-pool/ants).
|
- Keep in mind that there is always welcome to ask questions on [Discord](https://discord.gg/Cuy7KPaWQc).
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
id: checklist
|
id: checklist
|
||||||
attributes:
|
attributes:
|
||||||
|
|
|
@ -11,7 +11,7 @@ body:
|
||||||
value: |
|
value: |
|
||||||
## Before you go any further
|
## Before you go any further
|
||||||
- Please read [<u>*How To Ask Questions The Smart Way*</u>](http://www.catb.org/~esr/faqs/smart-questions.html) ( Chinese translation: [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)) before you file an issue formally.
|
- Please read [<u>*How To Ask Questions The Smart Way*</u>](http://www.catb.org/~esr/faqs/smart-questions.html) ( Chinese translation: [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)) before you file an issue formally.
|
||||||
- Keep in mind that there is always welcome to ask questions on [Gitter](https://gitter.im/ants-pool/ants).
|
- Keep in mind that there is always welcome to ask questions on [Discord](https://discord.gg/Cuy7KPaWQc).
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: feature-request
|
id: feature-request
|
||||||
attributes:
|
attributes:
|
||||||
|
|
|
@ -9,7 +9,7 @@ body:
|
||||||
value: |
|
value: |
|
||||||
## Before you go any further
|
## Before you go any further
|
||||||
- Please read [<u>*How To Ask Questions The Smart Way*</u>](http://www.catb.org/~esr/faqs/smart-questions.html) ( Chinese translation: [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)) before you file an issue formally.
|
- Please read [<u>*How To Ask Questions The Smart Way*</u>](http://www.catb.org/~esr/faqs/smart-questions.html) ( Chinese translation: [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)) before you file an issue formally.
|
||||||
- Keep in mind that there is always welcome to ask questions on [Gitter](https://gitter.im/ants-pool/ants).
|
- Keep in mind that there is always welcome to ask questions on [Discord](https://discord.gg/Cuy7KPaWQc).
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: question
|
id: question
|
||||||
attributes:
|
attributes:
|
||||||
|
|
|
@ -42,20 +42,20 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: go
|
languages: go
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below).
|
# If this step fails, then you should remove it and run the build manually (see below).
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v2
|
uses: github/codeql-action/autobuild@v3
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
@ -69,4 +69,4 @@ jobs:
|
||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
|
@ -37,17 +37,17 @@ jobs:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '^1.16'
|
go-version: '^1.16'
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup and run golangci-lint
|
- name: Setup and run golangci-lint
|
||||||
uses: golangci/golangci-lint-action@v3
|
uses: golangci/golangci-lint-action@v3
|
||||||
with:
|
with:
|
||||||
version: v1.51.2
|
version: v1.55.2
|
||||||
args: --timeout 5m -v -E gofumpt -E gocritic -E misspell -E revive -E godot
|
args: --timeout 5m -v -E gofumpt -E gocritic -E misspell -E revive -E godot
|
||||||
test:
|
test:
|
||||||
needs: lint
|
needs: lint
|
||||||
|
@ -60,12 +60,12 @@ jobs:
|
||||||
runs-on: ${{ matrix.os}}
|
runs-on: ${{ matrix.os}}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.ref }}
|
ref: ${{ github.ref }}
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go }}
|
go-version: ${{ matrix.go }}
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ jobs:
|
||||||
echo "GO_CACHE=$(go env GOCACHE)" >> $GITHUB_OUTPUT
|
echo "GO_CACHE=$(go env GOCACHE)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Cache go modules
|
- name: Cache go modules
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
${{ steps.go-env.outputs.GO_CACHE }}
|
${{ steps.go-env.outputs.GO_CACHE }}
|
||||||
|
@ -96,11 +96,12 @@ jobs:
|
||||||
run: go test -v -race -coverprofile="codecov.report" -covermode=atomic
|
run: go test -v -race -coverprofile="codecov.report" -covermode=atomic
|
||||||
|
|
||||||
- name: Upload code coverage report to Codecov
|
- name: Upload code coverage report to Codecov
|
||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v4
|
||||||
with:
|
with:
|
||||||
file: ./codecov.report
|
file: ./codecov.report
|
||||||
flags: unittests
|
flags: unittests
|
||||||
name: codecov-ants
|
name: codecov-ants
|
||||||
fail_ci_if_error: true
|
fail_ci_if_error: true
|
||||||
verbose: true
|
verbose: true
|
||||||
|
env:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
38
README.md
38
README.md
|
@ -7,7 +7,6 @@
|
||||||
<a title="Release" target="_blank" href="https://github.com/panjf2000/ants/releases"><img src="https://img.shields.io/github/v/release/panjf2000/ants.svg?color=161823&style=flat-square&logo=smartthings" /></a>
|
<a title="Release" target="_blank" href="https://github.com/panjf2000/ants/releases"><img src="https://img.shields.io/github/v/release/panjf2000/ants.svg?color=161823&style=flat-square&logo=smartthings" /></a>
|
||||||
<a title="Tag" target="_blank" href="https://github.com/panjf2000/ants/tags"><img src="https://img.shields.io/github/v/tag/panjf2000/ants?color=%23ff8936&logo=fitbit&style=flat-square" /></a>
|
<a title="Tag" target="_blank" href="https://github.com/panjf2000/ants/tags"><img src="https://img.shields.io/github/v/tag/panjf2000/ants?color=%23ff8936&logo=fitbit&style=flat-square" /></a>
|
||||||
<br/>
|
<br/>
|
||||||
<a title="Chat Room" target="_blank" href="https://gitter.im/ants-pool/ants?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge"><img src="https://badges.gitter.im/ants-pool/ants.svg" /></a>
|
|
||||||
<a title="Go Report Card" target="_blank" href="https://goreportcard.com/report/github.com/panjf2000/ants"><img src="https://goreportcard.com/badge/github.com/panjf2000/ants?style=flat-square" /></a>
|
<a title="Go Report Card" target="_blank" href="https://goreportcard.com/report/github.com/panjf2000/ants"><img src="https://goreportcard.com/badge/github.com/panjf2000/ants?style=flat-square" /></a>
|
||||||
<a title="Doc for ants" target="_blank" href="https://pkg.go.dev/github.com/panjf2000/ants/v2?tab=doc"><img src="https://img.shields.io/badge/go.dev-doc-007d9c?style=flat-square&logo=read-the-docs" /></a>
|
<a title="Doc for ants" target="_blank" href="https://pkg.go.dev/github.com/panjf2000/ants/v2?tab=doc"><img src="https://img.shields.io/badge/go.dev-doc-007d9c?style=flat-square&logo=read-the-docs" /></a>
|
||||||
<a title="Mentioned in Awesome Go" target="_blank" href="https://github.com/avelino/awesome-go#goroutines"><img src="https://awesome.re/mentioned-badge-flat.svg" /></a>
|
<a title="Mentioned in Awesome Go" target="_blank" href="https://github.com/avelino/awesome-go#goroutines"><img src="https://awesome.re/mentioned-badge-flat.svg" /></a>
|
||||||
|
@ -122,6 +121,39 @@ func main() {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
fmt.Printf("running goroutines: %d\n", p.Running())
|
fmt.Printf("running goroutines: %d\n", p.Running())
|
||||||
fmt.Printf("finish all tasks, result is %d\n", sum)
|
fmt.Printf("finish all tasks, result is %d\n", sum)
|
||||||
|
if sum != 499500 {
|
||||||
|
panic("the final result is wrong!!!")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the MultiPool and set the capacity of the 10 goroutine pools to unlimited.
|
||||||
|
// If you use -1 as the pool size parameter, the size will be unlimited.
|
||||||
|
// There are two load-balancing algorithms for pools: ants.RoundRobin and ants.LeastTasks.
|
||||||
|
mp, _ := ants.NewMultiPool(10, -1, ants.RoundRobin)
|
||||||
|
defer mp.ReleaseTimeout(5 * time.Second)
|
||||||
|
for i := 0; i < runTimes; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
_ = mp.Submit(syncCalculateSum)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Printf("running goroutines: %d\n", mp.Running())
|
||||||
|
fmt.Printf("finish all tasks.\n")
|
||||||
|
|
||||||
|
// Use the MultiPoolFunc and set the capacity of 10 goroutine pools to (runTimes/10).
|
||||||
|
mpf, _ := ants.NewMultiPoolWithFunc(10, runTimes/10, func(i interface{}) {
|
||||||
|
myFunc(i)
|
||||||
|
wg.Done()
|
||||||
|
}, ants.LeastTasks)
|
||||||
|
defer mpf.ReleaseTimeout(5 * time.Second)
|
||||||
|
for i := 0; i < runTimes; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
_ = mpf.Invoke(int32(i))
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Printf("running goroutines: %d\n", mpf.Running())
|
||||||
|
fmt.Printf("finish all tasks, result is %d\n", sum)
|
||||||
|
if sum != 499500*2 {
|
||||||
|
panic("the final result is wrong!!!")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -327,7 +359,7 @@ The source code in `ants` is available under the [MIT License](/LICENSE).
|
||||||
|
|
||||||
The following companies/organizations use `ants` in production.
|
The following companies/organizations use `ants` in production.
|
||||||
|
|
||||||
<a href="https://www.tencent.com"><img src="http://img.taohuawu.club/gallery/tencent_logo.png" width="250" align="middle"/></a> <a href="https://www.bytedance.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/ByteDance_Logo.png" width="250" align="middle"/></a> <a href="https://tieba.baidu.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/baidu-tieba-logo.png" width="300" align="middle"/></a> <a href="https://www.sina.com.cn/" target="_blank"><img src="http://img.taohuawu.club/gallery/sina-logo.png" width="200" align="middle"/></a> <a href="https://www.163.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/netease-logo.png" width="150" align="middle"/></a> <a href="https://www.tencentmusic.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/tencent-music-logo.png" width="250" align="middle"/></a> <a href="https://www.futuhk.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/futu-logo.png" width="250" align="middle"/></a> <a href="https://www.shopify.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/shopify-logo.png" width="250" align="middle"/></a> <a href="https://www.wechat.com/en/" target="_blank"><img src="http://img.taohuawu.club/gallery/wechat-logo.png" width="250" align="middle"/></a><a href="https://www.baidu.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/baidu-mobile.png" width="250" align="middle"/></a> <a href="https://www.360.com" target="_blank"><img src="http://img.taohuawu.club/gallery/360-logo.png" width="250" align="middle"/></a><a href="https://www.huaweicloud.com/intl/en-us/" target="_blank"><img src="https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/%E7%BB%84%E4%BB%B6%E9%AA%8C%E8%AF%81/pep-common-header/logo-en.png" width="250" align="middle"/></a> <a href="https://www.matrixorigin.io" target="_blank"><img src="https://www.matrixorigin.io/_next/static/media/logo-light-en.42553c69.svg" width="250" align="middle"/></a> <a href="https://adguard-dns.io" target="_blank"><img src="https://cdn.adtidy.org/website/images/AdGuardDNS_black.svg" width="250" align="middle"/></a> <a href="https://bk.tencent.com" target="_blank"><img src="https://static.apiseven.com/2022/11/14/6371adab14119.png" width="250" align="middle"/></a>
|
<a href="https://www.tencent.com"><img src="https://res.strikefreedom.top/static_res/logos/tencent_logo.png" width="250" align="middle"/></a> <a href="https://www.bytedance.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/ByteDance_Logo.png" width="250" align="middle"/></a> <a href="https://tieba.baidu.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/baidu-tieba-logo.png" width="300" align="middle"/></a> <a href="https://weibo.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/weibo-logo.png" width="300" align="middle"/></a> <a href="https://www.tencentmusic.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/tencent-music-logo.png" width="250" align="middle"/></a> <a href="https://www.futuhk.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/futu-logo.png" width="250" align="middle"/></a> <a href="https://www.shopify.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/shopify-logo.png" width="250" align="middle"/></a> <a href="https://www.wechat.com/en/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/wechat-logo.png" width="250" align="middle"/></a><a href="https://www.baidu.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/baidu-mobile.png" width="250" align="middle"/></a> <a href="https://www.360.com" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/360-logo.png" width="250" align="middle"/></a><a href="https://www.huaweicloud.com/intl/en-us/" target="_blank"><img src="https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/%E7%BB%84%E4%BB%B6%E9%AA%8C%E8%AF%81/pep-common-header/logo-en.png" width="250" align="middle"/></a> <a href="https://www.matrixorigin.io" target="_blank"><img src="https://www.matrixorigin.io/_next/static/media/logo-light-en.42553c69.svg" width="250" align="middle"/></a> <a href="https://adguard-dns.io" target="_blank"><img src="https://cdn.adtidy.org/website/images/AdGuardDNS_black.svg" width="250" align="middle"/></a> <a href="https://bk.tencent.com" target="_blank"><img src="https://static.apiseven.com/2022/11/14/6371adab14119.png" width="250" align="middle"/></a> <a href="https://www.alibabacloud.com" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/aliyun-intl.png" width="250" align="middle"/></a> <a href="https://www.zuoyebang.com" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/zuoyebang-logo.jpeg" width="300" align="middle"/></a>
|
||||||
|
|
||||||
### open-source software
|
### open-source software
|
||||||
|
|
||||||
|
@ -351,6 +383,8 @@ The open-source projects below do concurrent programming with the help of `ants`
|
||||||
- [AdGuardDNS](https://github.com/AdguardTeam/AdGuardDNS): AdGuard DNS is an alternative solution for tracker blocking, privacy protection, and parental control.
|
- [AdGuardDNS](https://github.com/AdguardTeam/AdGuardDNS): AdGuard DNS is an alternative solution for tracker blocking, privacy protection, and parental control.
|
||||||
- [WatchAD2.0](https://github.com/Qihoo360/WatchAD2.0): WatchAD2.0 是 360 信息安全中心开发的一款针对域安全的日志分析与监控系统,它可以收集所有域控上的事件日志、网络流量,通过特征匹配、协议分析、历史行为、敏感操作和蜜罐账户等方式来检测各种已知与未知威胁,功能覆盖了大部分目前的常见内网域渗透手法。
|
- [WatchAD2.0](https://github.com/Qihoo360/WatchAD2.0): WatchAD2.0 是 360 信息安全中心开发的一款针对域安全的日志分析与监控系统,它可以收集所有域控上的事件日志、网络流量,通过特征匹配、协议分析、历史行为、敏感操作和蜜罐账户等方式来检测各种已知与未知威胁,功能覆盖了大部分目前的常见内网域渗透手法。
|
||||||
- [vanus](https://github.com/vanus-labs/vanus): Vanus is a Serverless, event streaming system with processing capabilities. It easily connects SaaS, Cloud Services, and Databases to help users build next-gen Event-driven Applications.
|
- [vanus](https://github.com/vanus-labs/vanus): Vanus is a Serverless, event streaming system with processing capabilities. It easily connects SaaS, Cloud Services, and Databases to help users build next-gen Event-driven Applications.
|
||||||
|
- [trpc-go](https://github.com/trpc-group/trpc-go): A pluggable, high-performance RPC framework written in Golang.
|
||||||
|
- [motan-go](https://github.com/weibocom/motan-go): a remote procedure call (RPC) framework for the rapid development of high-performance distributed services.
|
||||||
|
|
||||||
#### All use cases:
|
#### All use cases:
|
||||||
|
|
||||||
|
|
38
README_ZH.md
38
README_ZH.md
|
@ -7,7 +7,6 @@
|
||||||
<a title="Release" target="_blank" href="https://github.com/panjf2000/ants/releases"><img src="https://img.shields.io/github/v/release/panjf2000/ants.svg?color=161823&style=flat-square&logo=smartthings" /></a>
|
<a title="Release" target="_blank" href="https://github.com/panjf2000/ants/releases"><img src="https://img.shields.io/github/v/release/panjf2000/ants.svg?color=161823&style=flat-square&logo=smartthings" /></a>
|
||||||
<a title="Tag" target="_blank" href="https://github.com/panjf2000/ants/tags"><img src="https://img.shields.io/github/v/tag/panjf2000/ants?color=%23ff8936&logo=fitbit&style=flat-square" /></a>
|
<a title="Tag" target="_blank" href="https://github.com/panjf2000/ants/tags"><img src="https://img.shields.io/github/v/tag/panjf2000/ants?color=%23ff8936&logo=fitbit&style=flat-square" /></a>
|
||||||
<br/>
|
<br/>
|
||||||
<a title="Chat Room" target="_blank" href="https://gitter.im/ants-pool/ants?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge"><img src="https://badges.gitter.im/ants-pool/ants.svg" /></a>
|
|
||||||
<a title="Go Report Card" target="_blank" href="https://goreportcard.com/report/github.com/panjf2000/ants"><img src="https://goreportcard.com/badge/github.com/panjf2000/ants?style=flat-square" /></a>
|
<a title="Go Report Card" target="_blank" href="https://goreportcard.com/report/github.com/panjf2000/ants"><img src="https://goreportcard.com/badge/github.com/panjf2000/ants?style=flat-square" /></a>
|
||||||
<a title="Doc for ants" target="_blank" href="https://pkg.go.dev/github.com/panjf2000/ants/v2?tab=doc"><img src="https://img.shields.io/badge/go.dev-doc-007d9c?style=flat-square&logo=read-the-docs" /></a>
|
<a title="Doc for ants" target="_blank" href="https://pkg.go.dev/github.com/panjf2000/ants/v2?tab=doc"><img src="https://img.shields.io/badge/go.dev-doc-007d9c?style=flat-square&logo=read-the-docs" /></a>
|
||||||
<a title="Mentioned in Awesome Go" target="_blank" href="https://github.com/avelino/awesome-go#goroutines"><img src="https://awesome.re/mentioned-badge-flat.svg" /></a>
|
<a title="Mentioned in Awesome Go" target="_blank" href="https://github.com/avelino/awesome-go#goroutines"><img src="https://awesome.re/mentioned-badge-flat.svg" /></a>
|
||||||
|
@ -122,6 +121,39 @@ func main() {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
fmt.Printf("running goroutines: %d\n", p.Running())
|
fmt.Printf("running goroutines: %d\n", p.Running())
|
||||||
fmt.Printf("finish all tasks, result is %d\n", sum)
|
fmt.Printf("finish all tasks, result is %d\n", sum)
|
||||||
|
if sum != 499500 {
|
||||||
|
panic("the final result is wrong!!!")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the MultiPool and set the capacity of the 10 goroutine pools to unlimited.
|
||||||
|
// If you use -1 as the pool size parameter, the size will be unlimited.
|
||||||
|
// There are two load-balancing algorithms for pools: ants.RoundRobin and ants.LeastTasks.
|
||||||
|
mp, _ := ants.NewMultiPool(10, -1, ants.RoundRobin)
|
||||||
|
defer mp.ReleaseTimeout(5 * time.Second)
|
||||||
|
for i := 0; i < runTimes; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
_ = mp.Submit(syncCalculateSum)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Printf("running goroutines: %d\n", mp.Running())
|
||||||
|
fmt.Printf("finish all tasks.\n")
|
||||||
|
|
||||||
|
// Use the MultiPoolFunc and set the capacity of 10 goroutine pools to (runTimes/10).
|
||||||
|
mpf, _ := ants.NewMultiPoolWithFunc(10, runTimes/10, func(i interface{}) {
|
||||||
|
myFunc(i)
|
||||||
|
wg.Done()
|
||||||
|
}, ants.LeastTasks)
|
||||||
|
defer mpf.ReleaseTimeout(5 * time.Second)
|
||||||
|
for i := 0; i < runTimes; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
_ = mpf.Invoke(int32(i))
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Printf("running goroutines: %d\n", mpf.Running())
|
||||||
|
fmt.Printf("finish all tasks, result is %d\n", sum)
|
||||||
|
if sum != 499500*2 {
|
||||||
|
panic("the final result is wrong!!!")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -328,7 +360,7 @@ pool.Reboot()
|
||||||
|
|
||||||
以下公司/组织在生产环境上使用了 `ants`。
|
以下公司/组织在生产环境上使用了 `ants`。
|
||||||
|
|
||||||
<a href="https://www.tencent.com"><img src="http://img.taohuawu.club/gallery/tencent_logo.png" width="250" align="middle"/></a> <a href="https://www.bytedance.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/ByteDance_Logo.png" width="250" align="middle"/></a> <a href="https://tieba.baidu.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/baidu-tieba-logo.png" width="300" align="middle"/></a> <a href="https://www.sina.com.cn/" target="_blank"><img src="http://img.taohuawu.club/gallery/sina-logo.png" width="200" align="middle"/></a> <a href="https://www.163.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/netease-logo.png" width="150" align="middle"/></a> <a href="https://www.tencentmusic.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/tencent-music-logo.png" width="250" align="middle"/></a> <a href="https://www.futuhk.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/futu-logo.png" width="250" align="middle"/></a> <a href="https://www.shopify.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/shopify-logo.png" width="250" align="middle"/></a> <a href="https://weixin.qq.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/wechat-logo.png" width="250" align="middle"/></a><a href="https://www.baidu.com/" target="_blank"><img src="http://img.taohuawu.club/gallery/baidu-mobile.png" width="250" align="middle"/></a> <a href="https://www.360.com" target="_blank"><img src="http://img.taohuawu.club/gallery/360-logo.png" width="250" align="middle"/></a><a href="https://www.huaweicloud.com" target="_blank"><img src="https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/wangxue/header/logo.svg" width="250" align="middle"/></a> <a href="https://matrixorigin.cn" target="_blank"><img src="https://matrixorigin.cn/_next/static/media/logo-light-zh.a2a8f3c0.svg" width="250" align="middle"/></a> <a href="https://adguard-dns.io" target="_blank"><img src="https://cdn.adtidy.org/website/images/AdGuardDNS_black.svg" width="250" align="middle"/></a> <a href="https://bk.tencent.com" target="_blank"><img src="https://static.apiseven.com/2022/11/14/6371adab14119.png" width="250" align="middle"/></a>
|
<a href="https://www.tencent.com"><img src="https://res.strikefreedom.top/static_res/logos/tencent_logo.png" width="250" align="middle"/></a> <a href="https://www.bytedance.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/ByteDance_Logo.png" width="250" align="middle"/></a> <a href="https://tieba.baidu.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/baidu-tieba-logo.png" width="300" align="middle"/></a> <a href="https://weibo.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/weibo-logo.png" width="300" align="middle"/></a> <a href="https://www.tencentmusic.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/tencent-music-logo.png" width="250" align="middle"/></a> <a href="https://www.futuhk.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/futu-logo.png" width="250" align="middle"/></a> <a href="https://www.shopify.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/shopify-logo.png" width="250" align="middle"/></a> <a href="https://weixin.qq.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/wechat-logo.png" width="250" align="middle"/></a><a href="https://www.baidu.com/" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/baidu-mobile.png" width="250" align="middle"/></a> <a href="https://www.360.com" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/360-logo.png" width="250" align="middle"/></a><a href="https://www.huaweicloud.com" target="_blank"><img src="https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/wangxue/header/logo.svg" width="250" align="middle"/></a> <a href="https://matrixorigin.cn" target="_blank"><img src="https://matrixorigin.cn/_next/static/media/logo-light-zh.a2a8f3c0.svg" width="250" align="middle"/></a> <a href="https://adguard-dns.io" target="_blank"><img src="https://cdn.adtidy.org/website/images/AdGuardDNS_black.svg" width="250" align="middle"/></a> <a href="https://bk.tencent.com" target="_blank"><img src="https://static.apiseven.com/2022/11/14/6371adab14119.png" width="250" align="middle"/></a> <a href="https://cn.aliyun.com" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/aliyun-cn.png" width="250" align="middle"/></a> <a href="https://www.zuoyebang.com" target="_blank"><img src="https://res.strikefreedom.top/static_res/logos/zuoyebang-logo.jpeg" width="300" align="middle"/></a>
|
||||||
|
|
||||||
### 开源软件
|
### 开源软件
|
||||||
|
|
||||||
|
@ -352,6 +384,8 @@ pool.Reboot()
|
||||||
- [AdGuardDNS](https://github.com/AdguardTeam/AdGuardDNS): AdGuard DNS is an alternative solution for tracker blocking, privacy protection, and parental control.
|
- [AdGuardDNS](https://github.com/AdguardTeam/AdGuardDNS): AdGuard DNS is an alternative solution for tracker blocking, privacy protection, and parental control.
|
||||||
- [WatchAD2.0](https://github.com/Qihoo360/WatchAD2.0): WatchAD2.0 是 360 信息安全中心开发的一款针对域安全的日志分析与监控系统,它可以收集所有域控上的事件日志、网络流量,通过特征匹配、协议分析、历史行为、敏感操作和蜜罐账户等方式来检测各种已知与未知威胁,功能覆盖了大部分目前的常见内网域渗透手法。
|
- [WatchAD2.0](https://github.com/Qihoo360/WatchAD2.0): WatchAD2.0 是 360 信息安全中心开发的一款针对域安全的日志分析与监控系统,它可以收集所有域控上的事件日志、网络流量,通过特征匹配、协议分析、历史行为、敏感操作和蜜罐账户等方式来检测各种已知与未知威胁,功能覆盖了大部分目前的常见内网域渗透手法。
|
||||||
- [vanus](https://github.com/vanus-labs/vanus): Vanus is a Serverless, event streaming system with processing capabilities. It easily connects SaaS, Cloud Services, and Databases to help users build next-gen Event-driven Applications.
|
- [vanus](https://github.com/vanus-labs/vanus): Vanus is a Serverless, event streaming system with processing capabilities. It easily connects SaaS, Cloud Services, and Databases to help users build next-gen Event-driven Applications.
|
||||||
|
- [trpc-go](https://github.com/trpc-group/trpc-go): 一个 Go 实现的可插拔的高性能 RPC 框架。
|
||||||
|
- [motan-go](https://github.com/weibocom/motan-go): 一套高性能、易于使用的分布式远程服务调用(RPC)框架。motan-go 是 motan 的 Go 语言实现。
|
||||||
|
|
||||||
#### 所有案例:
|
#### 所有案例:
|
||||||
|
|
||||||
|
|
|
@ -200,3 +200,27 @@ func BenchmarkAntsMultiPoolThroughput(b *testing.B) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkParallelAntsPoolThroughput(b *testing.B) {
|
||||||
|
p, _ := NewPool(PoolCap, WithExpiryDuration(DefaultExpiredTime))
|
||||||
|
defer p.Release()
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
_ = p.Submit(demoFunc)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkParallelAntsMultiPoolThroughput(b *testing.B) {
|
||||||
|
p, _ := NewMultiPool(10, PoolCap/10, RoundRobin, WithExpiryDuration(DefaultExpiredTime))
|
||||||
|
defer p.ReleaseTimeout(DefaultExpiredTime) //nolint:errcheck
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
_ = p.Submit(demoFunc)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ func main() {
|
||||||
fmt.Printf("running goroutines: %d\n", ants.Running())
|
fmt.Printf("running goroutines: %d\n", ants.Running())
|
||||||
fmt.Printf("finish all tasks.\n")
|
fmt.Printf("finish all tasks.\n")
|
||||||
|
|
||||||
// Use the pool with a method,
|
// Use the pool with a function,
|
||||||
// set 10 to the capacity of goroutine pool and 1 second for expired duration.
|
// set 10 to the capacity of goroutine pool and 1 second for expired duration.
|
||||||
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
|
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
|
||||||
myFunc(i)
|
myFunc(i)
|
||||||
|
@ -81,4 +81,34 @@ func main() {
|
||||||
if sum != 499500 {
|
if sum != 499500 {
|
||||||
panic("the final result is wrong!!!")
|
panic("the final result is wrong!!!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use the MultiPool and set the capacity of the 10 goroutine pools to unlimited.
|
||||||
|
// If you use -1 as the pool size parameter, the size will be unlimited.
|
||||||
|
// There are two load-balancing algorithms for pools: ants.RoundRobin and ants.LeastTasks.
|
||||||
|
mp, _ := ants.NewMultiPool(10, -1, ants.RoundRobin)
|
||||||
|
defer mp.ReleaseTimeout(5 * time.Second)
|
||||||
|
for i := 0; i < runTimes; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
_ = mp.Submit(syncCalculateSum)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Printf("running goroutines: %d\n", mp.Running())
|
||||||
|
fmt.Printf("finish all tasks.\n")
|
||||||
|
|
||||||
|
// Use the MultiPoolFunc and set the capacity of 10 goroutine pools to (runTimes/10).
|
||||||
|
mpf, _ := ants.NewMultiPoolWithFunc(10, runTimes/10, func(i interface{}) {
|
||||||
|
myFunc(i)
|
||||||
|
wg.Done()
|
||||||
|
}, ants.LeastTasks)
|
||||||
|
defer mpf.ReleaseTimeout(5 * time.Second)
|
||||||
|
for i := 0; i < runTimes; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
_ = mpf.Invoke(int32(i))
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Printf("running goroutines: %d\n", mpf.Running())
|
||||||
|
fmt.Printf("finish all tasks, result is %d\n", sum)
|
||||||
|
if sum != 499500*2 {
|
||||||
|
panic("the final result is wrong!!!")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,9 @@ type MultiPool struct {
|
||||||
// NewMultiPool instantiates a MultiPool with a size of the pool list and a size
|
// NewMultiPool instantiates a MultiPool with a size of the pool list and a size
|
||||||
// per pool, and the load-balancing strategy.
|
// per pool, and the load-balancing strategy.
|
||||||
func NewMultiPool(size, sizePerPool int, lbs LoadBalancingStrategy, options ...Option) (*MultiPool, error) {
|
func NewMultiPool(size, sizePerPool int, lbs LoadBalancingStrategy, options ...Option) (*MultiPool, error) {
|
||||||
|
if lbs != RoundRobin && lbs != LeastTasks {
|
||||||
|
return nil, ErrInvalidLoadBalancingStrategy
|
||||||
|
}
|
||||||
pools := make([]*Pool, size)
|
pools := make([]*Pool, size)
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
pool, err := NewPool(sizePerPool, options...)
|
pool, err := NewPool(sizePerPool, options...)
|
||||||
|
@ -64,9 +67,6 @@ func NewMultiPool(size, sizePerPool int, lbs LoadBalancingStrategy, options ...O
|
||||||
}
|
}
|
||||||
pools[i] = pool
|
pools[i] = pool
|
||||||
}
|
}
|
||||||
if lbs != RoundRobin && lbs != LeastTasks {
|
|
||||||
return nil, ErrInvalidLoadBalancingStrategy
|
|
||||||
}
|
|
||||||
return &MultiPool{pools: pools, lbs: lbs}, nil
|
return &MultiPool{pools: pools, lbs: lbs}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,9 @@ type MultiPoolWithFunc struct {
|
||||||
// NewMultiPoolWithFunc instantiates a MultiPoolWithFunc with a size of the pool list and a size
|
// NewMultiPoolWithFunc instantiates a MultiPoolWithFunc with a size of the pool list and a size
|
||||||
// per pool, and the load-balancing strategy.
|
// per pool, and the load-balancing strategy.
|
||||||
func NewMultiPoolWithFunc(size, sizePerPool int, fn func(interface{}), lbs LoadBalancingStrategy, options ...Option) (*MultiPoolWithFunc, error) {
|
func NewMultiPoolWithFunc(size, sizePerPool int, fn func(interface{}), lbs LoadBalancingStrategy, options ...Option) (*MultiPoolWithFunc, error) {
|
||||||
|
if lbs != RoundRobin && lbs != LeastTasks {
|
||||||
|
return nil, ErrInvalidLoadBalancingStrategy
|
||||||
|
}
|
||||||
pools := make([]*PoolWithFunc, size)
|
pools := make([]*PoolWithFunc, size)
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
pool, err := NewPoolWithFunc(sizePerPool, fn, options...)
|
pool, err := NewPoolWithFunc(sizePerPool, fn, options...)
|
||||||
|
@ -53,9 +56,6 @@ func NewMultiPoolWithFunc(size, sizePerPool int, fn func(interface{}), lbs LoadB
|
||||||
}
|
}
|
||||||
pools[i] = pool
|
pools[i] = pool
|
||||||
}
|
}
|
||||||
if lbs != RoundRobin && lbs != LeastTasks {
|
|
||||||
return nil, ErrInvalidLoadBalancingStrategy
|
|
||||||
}
|
|
||||||
return &MultiPoolWithFunc{pools: pools, lbs: lbs}, nil
|
return &MultiPoolWithFunc{pools: pools, lbs: lbs}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue