What is sync.Pool in golang and How to use it
sync.Pool (1/2)
Many Go libraries include custom thread-safe free lists, like this:
var objPool = make(chan *Object, 10)
func obj() *Object {
select {
| Latency Comparison Numbers (~2012) | |
| ---------------------------------- | |
| L1 cache reference 0.5 ns | |
| Branch mispredict 5 ns | |
| L2 cache reference 7 ns 14x L1 cache | |
| Mutex lock/unlock 25 ns | |
| Main memory reference 100 ns 20x L2 cache, 200x L1 cache | |
| Compress 1K bytes with Zippy 3,000 ns 3 us | |
| Send 1K bytes over 1 Gbps network 10,000 ns 10 us | |
| Read 4K randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD |
| $ FILE=/some/path/to/file.txt | |
| ################################### | |
| ### Remove matching suffix pattern | |
| ################################### | |
| $ echo ${FILE%.*} # remove ext | |
| /some/path/to/file | |
| $ FILE=/some/path/to/file.txt.jpg.gpg # note various file exts |
| redis-cli EVAL "$(cat hello.lua)" 0 |
What is sync.Pool in golang and How to use it
sync.Pool (1/2)
Many Go libraries include custom thread-safe free lists, like this:
var objPool = make(chan *Object, 10)
func obj() *Object {
select {
| package main | |
| import ( | |
| "crypto/rand" | |
| "crypto/rsa" | |
| "crypto/sha1" | |
| "crypto/x509" | |
| "encoding/base64" | |
| "encoding/pem" | |
| "fmt" |
| ;; -*- mode: emacs-lisp -*- | |
| ;; This file is loaded by Spacemacs at startup. | |
| ;; It must be stored in your home directory. | |
| (defun dotspacemacs/layers () | |
| "Configuration Layers declaration. | |
| You should not put any user code in this function besides modifying the variable | |
| values." | |
| (setq-default | |
| ;; Base distribution to use. This is a layer contained in the directory |
| package terraformer | |
| import ( | |
| "bytes" | |
| "errors" | |
| "path" | |
| "path/filepath" | |
| "...runtime" | |
| "...store" |
| # The command finds the most recent tag that is reachable from a commit. | |
| # If the tag points to the commit, then only the tag is shown. | |
| # Otherwise, it suffixes the tag name with the number of additional commits on top of the tagged object | |
| # and the abbreviated object name of the most recent commit. | |
| git describe | |
| # With --abbrev set to 0, the command can be used to find the closest tagname without any suffix: | |
| git describe --abbrev=0 | |
| # other examples |
| #!/bin/bash | |
| export AnException=100 | |
| export AnotherException=101 | |
| # start with a try | |
| try | |
| ( # open a subshell !!! | |
| echo "do something" | |
| [ someErrorCondition ] && throw $AnException |
| a.myhost.com { | |
| tls off | |
| root /var/www/ | |
| proxy / localhost:8091 | |
| log log/access.a.log | |
| } | |
| b.myhost.com { | |
| tls off | |
| root /var/www/ |