Конечно, я полностью понимаю Можно создать такое приложение в C/Rust/Zig/& C), но я просто изучаю способности языка GO и его современных компиляторов. () , но, кажется, не влияет на общее количество потоков со значениями ниже, чем текущее количество процессоров (или я просто делаю это неправильно).
В основном , Я хотел поиграть с созданием какого-то консольного приложения в старом стиле для Linux без какого-либо параллелизма и goroutines, просто бесконечное для цикл, который периодически выполняет некоторые вещи (возможно, чтение некоторых файлов в путем блокировки ввода/вывода и отображать некоторую информацию от них), где я иногда звоню коллекционеру мусора вручную, если мне нужно. >, debug.setmemorylimit и runtime.gc () . Но как я могу создать однопоточную? Или это невозможно по сути? >
Код: Выделить всё
package main
import (
"runtime"
"runtime/debug"
"strings"
"time"
)
func init() {
// Locking OS thread
runtime.LockOSThread()
// GOMAXPROCS=1, Any effect?
runtime.GOMAXPROCS(1)
// Turn off garbage collection
debug.SetGCPercent(-1)
//debug.SetMemoryLimit(math.MaxInt64)
}
func main() {
var index uint64
for {
index++
// Emulate some memory allocation
strings.Repeat("x", 10*1024)
// Get memory statistics
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// Output some info
println(index, memStats.Alloc/1024.0, memStats.Sys/1024.0, memStats.NumGC)
if index%20 == 0 {
// Run GC periodically
runtime.GC()
}
time.Sleep(time.Duration(500) * time.Millisecond)
}
}
< /code>
build for linux: < /p>
GOARCH=amd64 GOOS=linux go build -ldflags "-s -w" -trimpath .
< /p>
Я осознаю резервы времени выполнения, по крайней мере, один поток для приложения, один для коллекционера мусора и еще пара на всякий случай. Вопрос в том, является ли это поведение обязательным, или оно может как -то отключить? (Допустим, я хочу застрелить себя в ногу и сами справиться со всеми проблемами памяти и блокировки ввода-вывода.)
Подробнее здесь: https://stackoverflow.com/questions/794 ... linux-in-g