我使用http://github.com/dutchcoders/goftp通過 FTP 發(fā)送文件。它可以正常工作,但是當(dāng)我想上傳文件并獲取該文件信息時(shí)(同時(shí))它不起作用!fileName := "sth"var err errorvar ftp *goftp.FTPif 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.Fileif 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 stringfmt.Scan(&mnmn)ftp.Stor func 不會(huì)運(yùn)行,我的代碼返回以下輸出:startendfirstsecond2016/05/31 13:21:38 7 <nil>[][]
1 回答

絕地?zé)o雙
TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
目前,這兩個(gè) goroutine 都有相同的 ftp 實(shí)例(var ftp *goftp.FTP),它們相互阻塞,因?yàn)樗鼈冇懈?jìng)爭(zhēng)條件。你的結(jié)果是不可預(yù)測(cè)的。有時(shí),它在第一次正確執(zhí)行時(shí)會(huì)給出正確的結(jié)果。或者當(dāng)它等待第二個(gè)然后完全運(yùn)行時(shí)?;蛘弋?dāng) first 不執(zhí)行時(shí)。否則,兩個(gè) go 例程都會(huì)相互阻塞。解決方案:
您使用兩個(gè)不同的 ftp 實(shí)例來為 goroutine 提供不同的連接
var ftp,ftp1 *goftp.FTP
喜歡這里玩 Golang 或
在 main go 例程中首先有 *goftp 存儲(chǔ)。然后開始其他 goroutine。但這會(huì)破壞第二次圍棋例程的目的。
- 1 回答
- 0 關(guān)注
- 269 瀏覽
添加回答
舉報(bào)
0/150
提交
取消