Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

Golang :: ถ้าไม่ close body ของ response จะเกิดอะไรขึ้น ?

$
0
0

จากที่พูดคุยเรื่อง Memory leak สำหรับการใช้งาน package net/http ในภาษา Go
ซึ่งมี 2 เรื่องคือ

  • ถ้าไม่ปิด body ของ request จะเกิดอะไรขึ้น ?
  • ถ้าไม่ปิด body ของ response จะเกิดอะไรขึ้น ?

ในข้อแรกนั้นจากเอกสารใน code บอกว่า

ถ้าฝั่ง client side แล้ว
body ของ request เป็น nil เช่นใช้งาน HTTP GET แล้ว
ไม่จำเป็นต้อง close นะ
แต่ถ้าไม่ใช่ nil ก็จำเป็นต้องปิดเอง !!

[gist id="0186020130604d28f4bea0a7c3bc780c" file="1.txt"]

ในข้อที่สอง ตรงนี้ใน project ใช้บ่อยเลยลองไปดูหน่อยนึง

จากบทความเรื่อง 50 Mistake สำหรับ Golang ก็พูดเรื่องนี้
ว่าควรปิดและปิดให้ถูกต้องด้วย
จากการที่ไปดู code และลองเอามาเขียนให้เข้าใจง่าย ๆ
ก็เจอใน web พอดี

เป็นการไปเรียกข้อมูลมาจาก web/api ต่าง ๆ
ซึ่งในฝั่งเรียกหรืือ client จะใช้งาน Goroutines
พบว่า ถ้าเราไม่ทำการปิด body ของ response พบว่า
จะมี Goroutines ค้างอยู่เพียบเลย มัน leak ไหมนะ !!
ดังนี้

[gist id="0186020130604d28f4bea0a7c3bc780c" file="before.go"]

ผลการ run เป็นดังนี้

[code] $go run before.go Number of Goroutines start: 1 Number of Goroutines end: 201 [/code]

ดังนั้นจำเป็นต้องแก้ไขด้วยการปิด body ของ response ดังนี้

[gist id="0186020130604d28f4bea0a7c3bc780c" file="after.go"]

ผลที่ได้คือ จำนวนของ Goroutines ที่ค้างจะเหลือน้อยมาก ๆ
นั่นคือ มีการคืนหน่วยความจำกลับมาให้ระบบ
ตรงนี้น่าจะลดเรื่อง Memory leak ลงไปได้เยอะเลย

Reference Websites


Viewing all articles
Browse latest Browse all 1997

Trending Articles