|
- package io2
-
- import (
- "io"
- )
-
- // 复制一个流。注:返回的多个流的读取不能在同一个线程,且如果不再需要读取返回的某个流,那么必须关闭这个流,否则会阻塞其他流的读取。
- func Clone(str io.Reader, count int) []io.ReadCloser {
- prs := make([]io.ReadCloser, count)
- pws := make([]*io.PipeWriter, count)
-
- for i := 0; i < count; i++ {
- prs[i], pws[i] = io.Pipe()
- }
-
- go func() {
- pwCount := count
- buf := make([]byte, 4096)
- var closeErr error
- for {
- if pwCount == 0 {
- return
- }
-
- rd, err := str.Read(buf)
- for i := 0; i < count; i++ {
- if pws[i] == nil {
- continue
- }
-
- err := WriteAll(pws[i], buf[:rd])
- if err != nil {
- pws[i] = nil
- pwCount--
- }
- }
-
- if err == nil {
- continue
- }
-
- closeErr = err
- break
- }
-
- for i := 0; i < count; i++ {
- if pws[i] == nil {
- continue
- }
- pws[i].CloseWithError(closeErr)
- }
- }()
-
- return prs
- }
-
- /*
- func BufferedClone(str io.Reader, count int, bufSize int) []io.ReadCloser {
-
- }
- */
|