为了账号安全,请及时绑定邮箱和手机立即绑定

golang通过FTP上传,同时获取FTP进度

golang通过FTP上传,同时获取FTP进度

Go
狐的传说 2022-01-17 10:12:28
我使用http://github.com/dutchcoders/goftp通过 FTP 发送文件。它可以正常工作,但是当我想上传文件并获取该文件信息时(同时)它不起作用!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 不会运行,我的代码返回以下输出:startendfirstsecond2016/05/31 13:21:38 7 <nil>[][]
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

目前,这两个 goroutine 都有相同的 ftp 实例(var ftp *goftp.FTP),它们相互阻塞,因为它们有竞争条件。你的结果是不可预测的。有时,它在第一次正确执行时会给出正确的结果。或者当它等待第二个然后完全运行时。或者当 first 不执行时。否则,两个 go 例程都会相互阻塞。解决方案:

  • 您使用两个不同的 ftp 实例来为 goroutine 提供不同的连接

    var ftp,ftp1 *goftp.FTP

喜欢这里玩 Golang 或

  • 在 main go 例程中首先有 *goftp 存储。然后开始其他 goroutine。但这会破坏第二次围棋例程的目的。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号