我是一名新的Go程序员,来自Web应用程序和服务开发领域.道歉这是一个关于dep deprp的问题,但我的谷歌搜索答案还没有找到任何答案.此外,这是边缘服务器故障区域,但由于我对API /编程接口更感兴趣,我在这里问.
我使用net/http软件包的内置Web服务器编写了一个小程序.我正准备部署到生产环境,但我对模型Go Go的Web服务器以及我应该如何部署的过程有点不清楚.
具体来说 - 在我习惯的环境(PHP,Ruby,Python)中,我们在应用程序前面有一个Web服务器(Apache,Nginx等),我们将这些Web服务器配置为使用一定数量的工作进程/线程,并配置每个线程应处理的单个HTTP(S)连接数.
我无法找到有关Go的Web服务器如何处理此信息的信息,或者有关如何扩展/规划Go Web服务器规模的实用信息.
即 - 如果我有一个简单的程序运行,准备处理HTTP请求
func main() {
http.HandleFunc("/", processRequest)
http.ListenAndServe(":8000", nil)
}
Run Code Online (Sandbox Code Playgroud)
HandleFunc一次会尝试处理多少个连接?或者它会在连接打开时开始阻塞,并且只在连接关闭后才提供下一个连接?
或者我应该不担心这一点,并把所有东西都塞进一个常规程序?但是,如果我这样做,我如何防止系统被太多执行线程陷入困境?
我基本上是想要
就像我说的,我很新,所以如果我完全错过了这方面的情节,请告诉我!
我正在尝试用goroutines编写一个简单的工作池.
work_channel?码:
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func worker(id string, work string, o chan string, wg *sync.WaitGroup) {
defer wg.Done()
sleepMs := rand.Intn(1000)
fmt.Printf("worker '%s' received: '%s', sleep %dms\n", id, work, sleepMs)
time.Sleep(time.Duration(sleepMs) * time.Millisecond)
o <- work + fmt.Sprintf("-%dms", sleepMs)
}
func main() {
var work_channel = make(chan string)
var results_channel = make(chan string)
// create goroutine per item in work_channel
go func() {
var c = 0
var wg …Run Code Online (Sandbox Code Playgroud) 我收到compressedbytes类型为[] byte 的压缩ASCII文本字节.我面临的问题是,以下过程占用了大量内存,这些内存在函数到达其结束后未被释放,并且在程序的整个运行时期间仍然被占用.
b := bytes.NewReader(compressedbytes)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err = ioutil.ReadAll(r)
if err != nil {
panic(err)
}
Run Code Online (Sandbox Code Playgroud)
我注意到使用的类型是bytes.Buffer,这种类型具有Reset()和Truncate()函数,但它们都不允许释放曾经占用的内存.
该文档的Reset()状态如下:
重置将缓冲区重置为空,但它会保留底层存储以供将来的写入使用.重置与截断(0)相同.
如何取消缓冲区并再次释放内存?我的程序在运行期间需要大约50MB的内存,需要2小时.当我导入zlib压缩的字符串时,程序需要200 MB的内存.
谢谢你的帮助.
===更新
我甚至为解压缩创建了一个单独的函数,并runtime.GC()在程序从该函数返回后手动调用垃圾收集器,但没有成功.
// unpack decompresses zlib compressed bytes
func unpack(packedData []byte) []byte {
b := bytes.NewReader(packedData)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err := ioutil.ReadAll(r)
if …Run Code Online (Sandbox Code Playgroud) 我正在使用以下功能下载小于20MB的文件.它将整个内容读取到内存中,因为另一个函数必须在将字节写入磁盘之前对字节执行操作.
func getURL(url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, fmt.Errorf("getURL: %s", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("getURL: %s", err)
}
return body, nil
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但系统会消耗所有内存.
是否可以释放body由其他函数处理后使用的内存,因此内存使用量不会大于当前正在处理的字节数?