Удалить файл после 2-х процедур - PullRequest
0 голосов
/ 28 июня 2019

У меня есть простая процедура, которая вызывает локальный двоичный файл (rsync), который указывает на временный текстовый файл, содержащий список файлов для работы, с каталогом назначения.В конце процедуры я удаляю временный файл.Здесь нет проблем.

Но в некоторых случаях необходимо использовать один и тот же временный файл, когда в цикле диапазона есть два адресата, например:

destDirs := []string{"dir1/", "dir2/"}
for _, dest := range destDirs {
  go launchRoutine(tempfile.Name(), dest)
}

Так как launchRoutine можетдля запуска потребуется некоторое время, и, поскольку это веб-приложение, ожидание завершения процедуры не подходит.

Вопрос в том, где лучше всего разместить код os.Remove (tempfile)?

Вариант 1 - отправить launchRoutine фрагмент вместо строки и выполнить цикл по нему в launchRoutine, иудалите файл тогда.

Вариант 2 - отправить bool в launchRoutine, чтобы удалить файл, когда цикл диапазона находится на последней итерации.

Вариант 3 - Не знаете?Какие-нибудь идиоматические способы, о которых я не думал?

Решение, с которым я согласился, комментарии @ RJS подтверждают правильность решения:

destDirs := []string{"dir1/", "dir2/"}
for _, dest := range destDirs {
  go launchRoutine(tempfile.Name(), dest)
}
os.Remove(tempfile.Name())

Спасибо!

1 Ответ

2 голосов
/ 28 июня 2019

При условии, что я не понял ваше объяснение:

  • вариант 1, из того, что вы сказали, вы, вероятно, захотите сохранить цикл и поддерживать сопрограмму для каждого / dest.
  • вариант 2, не делайте этого.Если вы пытаетесь обмениваться информацией между форком и основным / другим форком, вам нужно использовать (синхронизировать) группу ожидания или, еще лучше, (синхронизировать) условие.Если вы оставите for exp {} в сопрограмме в ожидании изменения какого-либо общего ресурса, это сожрет процессор и вызовет значительное замедление.Даже если вы используете там сон, он заменяет потраченное впустую процессор на потраченное время и отсутствие координации.Использование sync.condition wait () фактически приостанавливает подпрограмму, позволяя другим подпрограммам работать вместо нее, и waitgroup также является вполне приемлемым вариантом.

Возможно, я неправильно понимаю, но, надеюсь, мне помогли.

...