cargar golang a través de FTP y obtener el progreso de FTP al mismo tiempo
concurrency (1)
Actualmente, ambos tienen la misma instancia de ftp (var ftp * goftp.FTP) que se bloquean entre sí ya que tienen una condición de carrera. Y tu resultado es impredecible. En algún momento, da el resultado correcto cuando primero se ejecuta correctamente. O cuando espera el segundo y luego se ejecuta completamente. O cuando primero no se ejecuta. De lo contrario, ambas rutinas se bloquean entre sí. Solutons:
Toma dos instancias diferentes de ftp para dar diferentes conexiones a la rutina
var ftp,ftp1 *goftp.FTP
Me gusta aquí Juega Golang O
- Tener * goftp stor primero en la rutina principal. Luego comienza otra rutina. Pero derrotará el propósito de la segunda rutina.
He usado http://github.com/dutchcoders/goftp para enviar un archivo a través de FTP. Funciona normalmente, pero cuando quiero cargar un archivo y obtener esa información de archivo (al mismo tiempo) ¡No funciona!
fileName := "sth"
var err error
var ftp *goftp.FTP
if ftp, err = goftp.Connect("serverip:port"); err != nil {
fmt.Println(err)
}
defer ftp.Close()
config := tls.Config{
InsecureSkipVerify: true,
ClientAuth: tls.RequestClientCert,
}
if err = ftp.AuthTLS(config); err != nil {
// log.Println("1", err)
}
if err = ftp.Login("userName", "pass"); err != nil {
log.Println("2", err)
}
//
if err = ftp.Cwd("/home/myDir/"); err != nil {
log.Println("3", err)
}
var file *os.File
if file, err = os.Open(fileName); err != nil {
log.Println("6", err)
}
defer file.Close()
fmt.Println("start")
go func() {
fmt.Println("first")
nmp := ftp.Stor(fileName, file)
if nmp != nil {
log.Println("7", err)
} else {
fmt.Println("first is runung")
}
}()
go func() {
fmt.Println("second")
for {
files, nms := ftp.List(fileName)
if nms == nil {
fmt.Println(files)
}
time.Sleep(1 * time.Second)
}
}()
fmt.Println("end")
var mnmn string
fmt.Scan(&mnmn)
ftp.Stor func no se ejecutará y mi código regresa por debajo de los resultados:
start end first second 2016/05/31 13:21:38 7 <nil> [] []