2017-03-09 14 views
1

私のクラウドプログラム用のカスタム書き込みインターフェースを実装しました。 私の問題はこれまでのところ、私のライターにファイルをコピーしてライターを閉じた後、ライターはまだいくつかの書き込みをしています(通常4つはそれぞれ約4096バイトを書き込みます)。最後の書き込みは、これはまだ起きていない通常未満4096書き込みが完了する前にGolangプログラムがファイルを閉じる

ですが、私はそれが最後の書き込みが4096バイトであり、私のプログラムが終了しません1/4096の確率である知っています。

私はこれをZIPプログラムに使用していますが、io.EOFはすべての書き込みチャンクには有効ではありません。また、ライターが閉じているかどうかを確認してもまだ早すぎます。

この状況を処理する最善の方法は何ですか?

*** EDIT ***** 私はより強力なWrite()、Flush()およびClose()メソッドを実装しました。私がdefer Close()を使用するとすべてが良好ですが、私は手動で閉じる(呼び出す場合と同じ問題)終了

+1

データがまだ書かれているかどうかわかりません。すべてのチャンクにEOFがある場合は、何か間違っています。 – JimB

+0

ファイルを開いて、いくつかのバイトをコピーして閉じます。この部分は動作します。基本的な "Writer"は、通常、チャンクを書くことから推測するのに時間がかかります。だから、私はファイルが閉じられている状況を取得しますが、基本的な作家は追いついてほぼ終了しています。 – Godfrey

+0

通常のライターは、バッファリングされたすべての書き込みが完了するまで、Closeでブロックします。あなたの基礎となるライターが何であるか分かりませんが、正しく動作するようには聞こえません。 – JimB

答えて

0

であなたが作家に完全な制御を持っているので、あなたはすべてのゴルーチンが終了するのを、あなたのmainで待機するようwaitgroup を使用することができます。

0

より堅牢なClose()機能を実装することによって問題を解決しました。私もdefer Close()を使ってGolangが内部的にすべてのGorutinesを処理していることを確認しました。

関連する問題