github.com/gogf/gf@v1.16.9/os/gfpool/gfpool_z_unit_concurrent_test.go (about)

     1  package gfpool_test
     2  
     3  import (
     4  	"github.com/gogf/gf/os/gfile"
     5  	"github.com/gogf/gf/os/gfpool"
     6  	"github.com/gogf/gf/os/gtime"
     7  	"github.com/gogf/gf/test/gtest"
     8  	"github.com/gogf/gf/text/gstr"
     9  	"os"
    10  	"testing"
    11  )
    12  
    13  func Test_ConcurrentOS(t *testing.T) {
    14  	gtest.C(t, func(t *gtest.T) {
    15  		path := gfile.TempDir(gtime.TimestampNanoStr())
    16  		defer gfile.Remove(path)
    17  		f1, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    18  		t.Assert(err, nil)
    19  		defer f1.Close()
    20  
    21  		f2, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    22  		t.Assert(err, nil)
    23  		defer f2.Close()
    24  
    25  		for i := 0; i < 100; i++ {
    26  			_, err = f1.Write([]byte("@1234567890#"))
    27  			t.Assert(err, nil)
    28  		}
    29  		for i := 0; i < 100; i++ {
    30  			_, err = f2.Write([]byte("@1234567890#"))
    31  			t.Assert(err, nil)
    32  		}
    33  
    34  		for i := 0; i < 1000; i++ {
    35  			_, err = f1.Write([]byte("@1234567890#"))
    36  			t.Assert(err, nil)
    37  		}
    38  		for i := 0; i < 1000; i++ {
    39  			_, err = f2.Write([]byte("@1234567890#"))
    40  			t.Assert(err, nil)
    41  		}
    42  		t.Assert(gstr.Count(gfile.GetContents(path), "@1234567890#"), 2200)
    43  	})
    44  
    45  	gtest.C(t, func(t *gtest.T) {
    46  		path := gfile.TempDir(gtime.TimestampNanoStr())
    47  		defer gfile.Remove(path)
    48  		f1, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    49  		t.Assert(err, nil)
    50  		defer f1.Close()
    51  
    52  		f2, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    53  		t.Assert(err, nil)
    54  		defer f2.Close()
    55  
    56  		for i := 0; i < 1000; i++ {
    57  			_, err = f1.Write([]byte("@1234567890#"))
    58  			t.Assert(err, nil)
    59  		}
    60  		for i := 0; i < 1000; i++ {
    61  			_, err = f2.Write([]byte("@1234567890#"))
    62  			t.Assert(err, nil)
    63  		}
    64  		t.Assert(gstr.Count(gfile.GetContents(path), "@1234567890#"), 2000)
    65  	})
    66  	gtest.C(t, func(t *gtest.T) {
    67  		path := gfile.TempDir(gtime.TimestampNanoStr())
    68  		defer gfile.Remove(path)
    69  		f1, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    70  		t.Assert(err, nil)
    71  		defer f1.Close()
    72  
    73  		f2, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    74  		t.Assert(err, nil)
    75  		defer f2.Close()
    76  
    77  		s1 := ""
    78  		for i := 0; i < 1000; i++ {
    79  			s1 += "@1234567890#"
    80  		}
    81  		_, err = f2.Write([]byte(s1))
    82  		t.Assert(err, nil)
    83  
    84  		s2 := ""
    85  		for i := 0; i < 1000; i++ {
    86  			s2 += "@1234567890#"
    87  		}
    88  		_, err = f2.Write([]byte(s2))
    89  		t.Assert(err, nil)
    90  
    91  		t.Assert(gstr.Count(gfile.GetContents(path), "@1234567890#"), 2000)
    92  	})
    93  	// DATA RACE
    94  	//gtest.C(t, func(t *gtest.T) {
    95  	//	path := gfile.TempDir(gtime.TimestampNanoStr())
    96  	//	defer gfile.Remove(path)
    97  	//	f1, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
    98  	//	t.Assert(err, nil)
    99  	//	defer f1.Close()
   100  	//
   101  	//	f2, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
   102  	//	t.Assert(err, nil)
   103  	//	defer f2.Close()
   104  	//
   105  	//	wg := sync.WaitGroup{}
   106  	//	ch := make(chan struct{})
   107  	//	for i := 0; i < 1000; i++ {
   108  	//		wg.Add(1)
   109  	//		go func() {
   110  	//			defer wg.Done()
   111  	//			<-ch
   112  	//			_, err = f1.Write([]byte("@1234567890#"))
   113  	//			t.Assert(err, nil)
   114  	//		}()
   115  	//	}
   116  	//	for i := 0; i < 1000; i++ {
   117  	//		wg.Add(1)
   118  	//		go func() {
   119  	//			defer wg.Done()
   120  	//			<-ch
   121  	//			_, err = f2.Write([]byte("@1234567890#"))
   122  	//			t.Assert(err, nil)
   123  	//		}()
   124  	//	}
   125  	//	close(ch)
   126  	//	wg.Wait()
   127  	//	t.Assert(gstr.Count(gfile.GetContents(path), "@1234567890#"), 2000)
   128  	//})
   129  }
   130  
   131  func Test_ConcurrentGFPool(t *testing.T) {
   132  	gtest.C(t, func(t *gtest.T) {
   133  		path := gfile.TempDir(gtime.TimestampNanoStr())
   134  		defer gfile.Remove(path)
   135  		f1, err := gfpool.Open(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
   136  		t.Assert(err, nil)
   137  		defer f1.Close()
   138  
   139  		f2, err := gfpool.Open(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
   140  		t.Assert(err, nil)
   141  		defer f2.Close()
   142  
   143  		for i := 0; i < 1000; i++ {
   144  			_, err = f1.Write([]byte("@1234567890#"))
   145  			t.Assert(err, nil)
   146  		}
   147  		for i := 0; i < 1000; i++ {
   148  			_, err = f2.Write([]byte("@1234567890#"))
   149  			t.Assert(err, nil)
   150  		}
   151  		t.Assert(gstr.Count(gfile.GetContents(path), "@1234567890#"), 2000)
   152  	})
   153  	// DATA RACE
   154  	//gtest.C(t, func(t *gtest.T) {
   155  	//	path := gfile.TempDir(gtime.TimestampNanoStr())
   156  	//	defer gfile.Remove(path)
   157  	//	f1, err := gfpool.Open(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
   158  	//	t.Assert(err, nil)
   159  	//	defer f1.Close()
   160  	//
   161  	//	f2, err := gfpool.Open(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0666)
   162  	//	t.Assert(err, nil)
   163  	//	defer f2.Close()
   164  	//
   165  	//	wg := sync.WaitGroup{}
   166  	//	ch := make(chan struct{})
   167  	//	for i := 0; i < 1000; i++ {
   168  	//		wg.Add(1)
   169  	//		go func() {
   170  	//			defer wg.Done()
   171  	//			<-ch
   172  	//			_, err = f1.Write([]byte("@1234567890#"))
   173  	//			t.Assert(err, nil)
   174  	//		}()
   175  	//	}
   176  	//	for i := 0; i < 1000; i++ {
   177  	//		wg.Add(1)
   178  	//		go func() {
   179  	//			defer wg.Done()
   180  	//			<-ch
   181  	//			_, err = f2.Write([]byte("@1234567890#"))
   182  	//			t.Assert(err, nil)
   183  	//		}()
   184  	//	}
   185  	//	close(ch)
   186  	//	wg.Wait()
   187  	//	t.Assert(gstr.Count(gfile.GetContents(path), "@1234567890#"), 2000)
   188  	//})
   189  }