Почему с "go" не шипит в файл?

65 views
Skip to first unread message

fastpars

unread,
Jul 4, 2011, 2:17:03 PM7/4/11
to golang-...@googlegroups.com
Привет.
Не отучается писать в файл в несколько потоков.
Сабж.
Это возможно ?

package main

import(
"os"
)
 
const filename = "bigfile.txt";

func writeBig(f *os.File) {
for i:=0; i < 10000000; i++ {
f.Write([]byte("1"))
}
}

func main() {
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600)
if err != nil {
os.Exit(1)
}
go writeBig(f)
}

fastpars

unread,
Jul 6, 2011, 5:21:34 PM7/6/11
to golang-...@googlegroups.com
Разобрался. Основной пток программы завершается раньше чем нужно.

самое простое решение - time.Sleep() в конце main

Maxim Treskin

unread,
Jul 6, 2011, 5:38:31 PM7/6/11
to golang-...@googlegroups.com
time.Sleep — плохое решение. Посмотрите на каналы, они как раз для таких действий нужны.
Создаёте небуферизированный канал, после вызова go writeBig ожидаете из него сообщение, а в самой функции writeBig после выполнения записи, пишете в этот канал сообщение.
В результате функция main завершится ровно тогда, когда получит сообщение из канала.

2011/7/7 fastpars <fast...@gmail.com>
Разобрался. Основной пток программы завершается раньше чем нужно.

самое простое решение - time.Sleep() в конце main

--
Страница рассылки: http://groups.google.com/group/golang-russian
Написать письмо: golang-...@googlegroups.com
Отписаться: golang-russia...@googlegroups.com



--
Maxim Treskin

fastpars

unread,
Jul 7, 2011, 8:02:58 PM7/7/11
to golang-...@googlegroups.com
Спасибо.
По примеру Операционная система на Go? | Santa Simplicita всё получилось.

Если нужно запустить несколько go func то следует обзавестись глобальной переменной, которая инкрементируется по выполнению нужной работы и отсылает канал по завершению всех goroutines.

Reply all
Reply to author
Forward
0 new messages