{"id":23080069,"url":"https://github.com/kilianpaquier/pooling","last_synced_at":"2026-01-20T21:01:33.024Z","repository":{"id":224293707,"uuid":"762659847","full_name":"kilianpaquier/pooling","owner":"kilianpaquier","description":"Easily dispatch functions (and subfunctions indefinitely) into a shared pool of routines in golang","archived":false,"fork":false,"pushed_at":"2026-01-10T20:43:36.000Z","size":128,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T06:16:41.450Z","etag":null,"topics":["golang","parallel-computing","queue-tasks","recursive-algorithm"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/kilianpaquier/pooling","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kilianpaquier.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-24T10:33:45.000Z","updated_at":"2026-01-10T20:43:39.000Z","dependencies_parsed_at":"2024-03-18T23:24:56.620Z","dependency_job_id":"50fac5aa-346d-4fae-bc0b-cac81b063bf8","html_url":"https://github.com/kilianpaquier/pooling","commit_stats":null,"previous_names":["kilianpaquier/pooling"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/kilianpaquier/pooling","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kilianpaquier%2Fpooling","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kilianpaquier%2Fpooling/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kilianpaquier%2Fpooling/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kilianpaquier%2Fpooling/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kilianpaquier","download_url":"https://codeload.github.com/kilianpaquier/pooling/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kilianpaquier%2Fpooling/sbom","scorecard":{"id":1238580,"data":{"date":"2025-10-06T21:00:03Z","repo":{"name":"github.com/kilianpaquier/pooling","commit":"c4cc42c278025c17b2832bfdde2c09ef67c662fd"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":6,"checks":[{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":0,"reason":"Found 0/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Maintained","score":4,"reason":"5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  23 out of  23 GitHub-owned GitHubAction dependencies pinned","Info:  22 out of  22 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/dependency-submission.yml:38","Info: jobLevel 'actions' permission set to 'read': .github/workflows/deployment.yml:30","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/deployment.yml:74","Info: found token with 'none' permissions: .github/workflows/deployment.yml:77","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/deployment.yml:130","Info: found token with 'none' permissions: .github/workflows/deployment.yml:133","Warn: jobLevel 'actions' permission set to 'write': .github/workflows/integration.yml:219","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/integration.yml:43","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/integration.yml:114","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scorecard.yml:30","Info: jobLevel 'checks' permission set to 'read': .github/workflows/scorecard.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecard.yml:32","Info: jobLevel 'issues' permission set to 'read': .github/workflows/scorecard.yml:34","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/scorecard.yml:35","Info: topLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:32","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:15","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-submission.yml:31","Info: topLevel 'contents' permission set to 'read': .github/workflows/deployment.yml:23","Info: topLevel 'contents' permission set to 'read': .github/workflows/integration.yml:33","Info: topLevel 'contents' permission set to 'read': .github/workflows/scorecard.yml:22"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"SAST","score":8,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 3 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'main'","Warn: PRs are not required to make changes on branch 'main'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.0.13 not signed: https://api.github.com/repos/kilianpaquier/pooling/releases/215589074","Warn: release artifact v1.0.12 not signed: https://api.github.com/repos/kilianpaquier/pooling/releases/211358424","Warn: release artifact v1.0.11 not signed: https://api.github.com/repos/kilianpaquier/pooling/releases/204787261","Warn: release artifact v1.0.10 not signed: https://api.github.com/repos/kilianpaquier/pooling/releases/202125401","Warn: release artifact v1.0.9 not signed: https://api.github.com/repos/kilianpaquier/pooling/releases/199365057","Warn: release artifact v1.0.13 does not have provenance: https://api.github.com/repos/kilianpaquier/pooling/releases/215589074","Warn: release artifact v1.0.12 does not have provenance: https://api.github.com/repos/kilianpaquier/pooling/releases/211358424","Warn: release artifact v1.0.11 does not have provenance: https://api.github.com/repos/kilianpaquier/pooling/releases/204787261","Warn: release artifact v1.0.10 does not have provenance: https://api.github.com/repos/kilianpaquier/pooling/releases/202125401","Warn: release artifact v1.0.9 does not have provenance: https://api.github.com/repos/kilianpaquier/pooling/releases/199365057"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: semantic-release"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"7 out of 7 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-10-06T22:34:58.010Z","repository_id":224293707,"created_at":"2025-10-06T22:34:58.010Z","updated_at":"2025-10-06T22:34:58.010Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28613659,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T18:56:40.769Z","status":"ssl_error","status_checked_at":"2026-01-20T18:54:26.653Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","parallel-computing","queue-tasks","recursive-algorithm"],"created_at":"2024-12-16T13:04:20.819Z","updated_at":"2026-01-20T21:01:33.012Z","avatar_url":"https://github.com/kilianpaquier.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pooling \u003c!-- omit in toc --\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"GitLab Release\" src=\"https://img.shields.io/gitlab/v/release/kilianpaquier%2Fpooling?gitlab_url=https%3A%2F%2Fgitlab.com\u0026include_prereleases\u0026sort=semver\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitLab Issues\" src=\"https://img.shields.io/gitlab/issues/open/kilianpaquier%2Fpooling?gitlab_url=https%3A%2F%2Fgitlab.com\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitLab License\" src=\"https://img.shields.io/gitlab/license/kilianpaquier%2Fpooling?gitlab_url=https%3A%2F%2Fgitlab.com\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitLab CICD\" src=\"https://img.shields.io/gitlab/pipeline-status/kilianpaquier%2Fpooling?gitlab_url=https%3A%2F%2Fgitlab.com\u0026branch=main\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"Go Version\" src=\"https://img.shields.io/gitlab/go-mod/go-version/kilianpaquier/pooling?style=for-the-badge\"\u003e\n  \u003cimg alt=\"Go Report Card\" src=\"https://goreportcard.com/badge/gitlab.com/kilianpaquier/pooling?style=for-the-badge\"\u003e\n\u003c/div\u003e\n\n---\n\n- [How to use ?](#how-to-use-)\n- [Features](#features)\n\n## How to use ?\n\n```sh\ngo get -u github.com/kilianpaquier/pooling@latest\n```\n\n## Features\n\nThe pooling package allows one to dispatch an infinite number of functions to be executed in parallel while still limiting the number of routines.\n\nFor that, pooling package takes advantage of ants pool library. A pooling Pooler can have multiple pools (with builder SetSizes) to dispatch sub functions into different pools of routines.\n\nWhen sending a function into the pooler (with the appropriate channel), this function can itself send other functions into the pooler. It allows one to \"split\" functions executions (like iterating over a slice and each element handled in parallel).\n\n```go\nfunc main() {\n    log := logrus.WithContext(context.Background())\n\n    pooler, err := pooling.NewPoolerBuilder().\n        SetSizes(10, 500, ...). // each size will initialize a pool with given size\n        SetOptions(ants.WithLogger(log)).\n        Build()\n    if err != nil {\n        panic(err)\n    }\n    defer pooler.Close()\n\n    input := ReadFrom()\n\n    // Read function is blocking until input is closed\n    // and all running routines have ended\n    pooler.Read(input)\n}\n\nfunc ReadFrom() \u003c-chan pooling.PoolerFunc {\n    input := make(chan pooling.PoolerFunc)\n\n    go func() {\n        // close input to stop blocking function Read once all elements are sent to input\n        defer close(input)\n\n        // do something populating input channel\n        for i := range 100 {\n            input \u003c- HandleInt(i)\n        }\n    }()\n\n    return input\n}\n\nfunc HandleInt(i int) pooling.PoolerFunc {\n    return func(funcs chan\u003c- pooling.PoolerFunc) {\n        // you may handle the integer whichever you want\n        // funcs channel is present to dispatch again some elements into a channel handled by the pooler\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkilianpaquier%2Fpooling","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkilianpaquier%2Fpooling","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkilianpaquier%2Fpooling/lists"}