Skip to content

Commit e532577

Browse files
committed
perf: concurrent deletion of top-level directories
1 parent 0610b89 commit e532577

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

fs.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ func RemoveAll(f string) error {
2525
}
2626

2727
entrysLen := len(entrys)
28-
29-
signal := struct{}{}
3028
errChan := make(chan error)
3129
signalChan := make(chan struct{}, entrysLen)
3230
resolve, reject, status := StatusPromise(signalChan, errChan)
@@ -40,15 +38,15 @@ func RemoveAll(f string) error {
4038
reject(err)
4139
return
4240
}
43-
resolve(signal)
41+
resolve(NoopSignal)
4442
return
4543
}
4644
err := RemoveAll(p)
4745
if err != nil {
4846
reject(err)
4947
return
5048
}
51-
resolve(signal)
49+
resolve(NoopSignal)
5250
}(entrys[i])
5351
}
5452

main.go

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,36 @@ func main() {
4343
os.Exit(0)
4444
}
4545

46-
cache_dirs := []string{".nuxt", "cache", ".cache", "@cache", "temp", ".temp", "@temp"}
46+
cacheDirs := []string{".nuxt", "cache", ".cache", "@cache", "temp", ".temp", "@temp"}
4747

48-
withDist(&cache_dirs)
48+
withDist(&cacheDirs)
4949

50-
withNodeModules(&cache_dirs)
50+
withNodeModules(&cacheDirs)
5151

52-
for _, v := range cache_dirs {
53-
if !IsExist(v) || !IsDir(v) {
54-
continue
55-
}
56-
err := RemoveAll(v)
57-
if err != nil {
58-
color.Red("remove fail: %v \nroot: %v", err, v)
59-
} else {
60-
color.Green("remove success: %v", v)
61-
}
52+
cacheDirsLen := len(cacheDirs)
53+
54+
errChan := make(chan error)
55+
signalChan := make(chan struct{}, cacheDirsLen)
56+
resolve, reject, status := StatusPromise(signalChan, errChan)
57+
58+
for _, v := range cacheDirs {
59+
go func(dir string) {
60+
if !IsExist(dir) || !IsDir(dir) {
61+
resolve(NoopSignal)
62+
return
63+
}
64+
err := RemoveAll(dir)
65+
if err != nil {
66+
reject(err)
67+
color.Red("remove fail: %v \nroot: %v", err, dir)
68+
} else {
69+
resolve(NoopSignal)
70+
color.Green("remove success: %v", dir)
71+
}
72+
}(v)
73+
}
74+
75+
for i := 0; i < cacheDirsLen; i++ {
76+
status()
6277
}
6378
}

promise.go renamed to utils.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package main
22

3+
var NoopSignal = struct{}{}
4+
35
func StatusPromise[T any](ch chan T, err chan error) (func(T), func(error), func() (T, error)) {
46
resolve := func(result T) {
57
ch <- result

0 commit comments

Comments
 (0)