Skip to content

Commit bdb4f6e

Browse files
committed
add AutoFree
1 parent 912dd97 commit bdb4f6e

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

cmd/serve/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ func main() {
3737
b.BlockRequests(blockList...)
3838
b.BypassUserAgentNames(bypassUAs...)
3939
b.MaxWait(*maxWait)
40-
b.WarnUp()
40+
b.WarmUp()
41+
b.AutoFree()
4142

4243
err := http.ListenAndServe(*port, b)
4344
if err != nil {

service.go

+26-3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ func (b *Bartender) MaxWait(d time.Duration) {
7373
b.maxWait = d
7474
}
7575

76+
func (b *Bartender) getPage() *rod.Page {
77+
return b.pool.Get(b.newPage)
78+
}
79+
7680
func (b *Bartender) newPage() *rod.Page {
7781
page := rod.New().MustConnect().MustPage()
7882

@@ -93,12 +97,31 @@ func (b *Bartender) newPage() *rod.Page {
9397
return page
9498
}
9599

96-
func (b *Bartender) WarnUp() {
100+
// WarmUp pre-creates the headless browsers.
101+
func (b *Bartender) WarmUp() {
97102
for i := 0; i < len(b.pool); i++ {
98-
b.pool.Put(b.pool.Get(b.newPage))
103+
b.pool.Put(b.getPage())
99104
}
100105
}
101106

107+
// AutoFree automatically closes the each headless browser after a period of time.
108+
// It prevent the memory leak of the headless browser.
109+
func (b *Bartender) AutoFree() {
110+
go func() {
111+
for {
112+
time.Sleep(10 * time.Minute)
113+
114+
err := b.getPage().Browser().Close()
115+
if err != nil {
116+
log.Println("failed to close browser:", err)
117+
118+
continue
119+
}
120+
b.pool.Put(nil)
121+
}
122+
}()
123+
}
124+
102125
func (b *Bartender) ServeHTTP(w http.ResponseWriter, r *http.Request) {
103126
ua := useragent.Parse(r.Header.Get("User-Agent"))
104127
if r.Method != http.MethodGet || b.bypassList[ua.Name] {
@@ -138,7 +161,7 @@ func (b *Bartender) RenderPage(w http.ResponseWriter, r *http.Request) bool {
138161

139162
w.WriteHeader(statusCode)
140163

141-
page := b.pool.Get(b.newPage)
164+
page := b.getPage()
142165
defer b.pool.Put(page)
143166

144167
page, cancel := page.WithCancel()

0 commit comments

Comments
 (0)