mirror of
https://gitee.com/johng/gf
synced 2026-07-06 13:42:46 +08:00
改进gfpool,提升IO性能比标准库高100%以上
This commit is contained in:
@ -101,22 +101,24 @@ func (p *Pool) File() (*File, error) {
|
||||
if v, err := p.pool.Get(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
f := v.(*File)
|
||||
f := v.(*File)
|
||||
stat, err := os.Stat(f.path)
|
||||
if f.flag & os.O_CREATE > 0 {
|
||||
if _, err := os.Stat(f.path); os.IsNotExist(err) {
|
||||
if os.IsNotExist(err) {
|
||||
if file, err := os.OpenFile(f.path, f.flag, f.perm); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
f.File = *file
|
||||
if stat, err = f.Stat(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if f.flag & os.O_TRUNC > 0 {
|
||||
if stat, err := f.Stat(); err == nil {
|
||||
if stat.Size() > 0 {
|
||||
if err := f.Truncate(0); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if stat.Size() > 0 {
|
||||
if err := f.Truncate(0); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -127,7 +129,6 @@ func (p *Pool) File() (*File, error) {
|
||||
} else {
|
||||
f.Seek(0, 0)
|
||||
}
|
||||
|
||||
if !p.inited.Set(true) {
|
||||
gfsnotify.Add(f.path, func(event *gfsnotify.Event) {
|
||||
// 如果文件被删除或者重命名,立即重建指针池
|
||||
|
||||
@ -64,7 +64,7 @@ const (
|
||||
|
||||
const (
|
||||
REPEAT_EVENT_FILTER_INTERVAL = 1 // (毫秒)重复事件过滤间隔
|
||||
DEFAULT_WATCHER_COUNT = 2 // 默认创建的监控对象数量(使用哈希取模)
|
||||
DEFAULT_WATCHER_COUNT = 4 // 默认创建的监控对象数量(使用哈希取模)
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@ -207,6 +207,7 @@ func (w *Watcher) startEventLoop() {
|
||||
for {
|
||||
if v := w.events.Pop(); v != nil {
|
||||
event := v.(*Event)
|
||||
// 如果是删除操作,那么需要判断是否文件真正不存在了
|
||||
if event.IsRemove() {
|
||||
if fileExists(event.Path) {
|
||||
// 如果是文件删除事件,判断该文件是否存在,如果存在,那么将此事件认为“假删除”,
|
||||
|
||||
@ -2,9 +2,15 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gitee.com/johng/gf/g/os/gtime"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(gtime.Now().Format("Y年m月d日 H时i分s秒"))
|
||||
for {
|
||||
stat, err := os.Stat("/home/john/temp/log")
|
||||
fmt.Println(err)
|
||||
fmt.Println(stat.Size())
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user