Безопасно ли вызывать метод из двух разных программ одновременно? - PullRequest
0 голосов
/ 26 апреля 2018

У меня две горутины go doProcess_A() и go doProcess_B(). Оба могут вызвать saveData(), метод не-goroutine.

я должен использовать перейти saveData () вместо saveData () ? Какой из них безопасен?

var waitGroup sync.WaitGroup

func main() {

    for i:=0; i<4; i++{
        waitGroup.Add(2)

        go doProcess_A(i)
        go doProcess_B(i)
    }
    waitGroup.Wait()
}

func doProcess_A(i int)  {
    // do process
    // the result will be stored in data variable
    data := "processed data-A as string"
    uniqueFileName := "file_A_"+strconv.Itoa(i)+".txt"
    saveData(uniqueFileName, data)

    waitGroup.Done()
}

func doProcess_B(i int) {
    // do some process
    // the result will be stored in data variable
    data := "processed data-B as string"
    uniqueFileName := "file_B_"+strconv.Itoa(i)+".txt"
    saveData(uniqueFileName, data)

    waitGroup.Done()
}

// write text file
func saveData(fileName ,dataStr string) {
    // file name will be unique.
    // there is no chance to be same file name
    err := ioutil.WriteFile("out/"+fileName, []byte(dataStr), 0644)
    if err != nil {
        panic(err)
    }
}

здесь, одна программа ожидает операции с дисковым файлом, когда другая программа выполняет? или две goroutine делают собственную копию saveData ()?

1 Ответ

0 голосов
/ 26 апреля 2018

Обычно программы не ждут ничего, за исключением того, что вы явно указываете им, или если операция ожидает на канале или другая операция блокировки. В вашем коде есть возможность состояния гонки с нежелательными результатами, если несколько программ вызовут функцию saveData() с одним и тем же именем файла. Похоже, что эти две программы пишут в разные файлы, поэтому, пока имена файлов уникальны, операция saveData будет безопасна в процедуре. Нет смысла использовать подпрограмму go для вызова saveData(), не излишне усложняйте свою жизнь, просто вызывайте ее напрямую в doProcess_X функциях.

Узнайте больше о goroutines и убедитесь, что вы используете его там, где это абсолютно необходимо. - https://gobyexample.com/goroutines

Примечание. То, что вы пишете приложение на Go, не означает, что вы следует засорять его горутинами. Прочитайте и поймите, в чем проблема решает, чтобы знать лучшее время для его использования.

...