返回顶部
首页 > 资讯 > 精选 >尝试写入/读取时 io.Pipe 和死锁
  • 165
分享到

尝试写入/读取时 io.Pipe 和死锁

2024-02-06 09:02:42 165人浏览 八月长安
摘要

问题内容 我花了几个小时尝试理解底层逻辑,但没有任何进展。下面的代码在第一次迭代后返回死锁。如果我在 io.copy 之前关闭 writer,死锁就会消失,但不会打印任何内容(因为管道

问题内容

我花了几个小时尝试理解底层逻辑,但没有任何进展。下面的代码在第一次迭代后返回死。如果我在 io.copy 之前关闭 writer,死锁就会消失,但不会打印任何内容(因为管道写入端在读取之前已关闭)

func main() {
    reader, writer := io.pipe()
    c := make(chan string)

    Go func() {
        for i := 0; i < 5; i++ {
            text := fmt.sprintf("hello %vth time", i+1)
            c <- text
        }

        close(c)
    }()

    for msg := range c {
        msg = fmt.sprintf("\nreceived from channel -> %v\n", msg)

        go fmt.fprint(writer, msg)
        io.copy(os.stdout, reader)
        writer.close()
    }

}

这是运行代码后的错误


received from channel -> hello 1th time fatal error: all goroutines
are asleep - deadlock!
goroutine 1 [select]: io.(*pipe).read(0xc000130120, {0xc00013e000,
0x8000, 0xc00011e001?})
/usr/lib/go/src/io/pipe.go:57 +0xb1 io.(*PipeReader).Read(0x0?, {0xc00013e000?, 0xc00011e050?, 0x10?})
/usr/lib/go/src/io/pipe.go:136 +0x25 io.copyBuffer({0x4bde98, 0xc00011e050}, {0x4bddb8, 0xc00012e018}, {0x0, 0x0, 0x0})
/usr/lib/go/src/io/io.go:427 +0x1b2 io.Copy(...)
/usr/lib/go/src/io/io.go:386 os.genericReadFrom(0x101c00002c500?, {0x4bddb8, 0xc00012e018})
/usr/lib/go/src/os/file.go:161 +0x67 os.(*File).ReadFrom(0xc00012e008, {0x4bddb8, 0xc00012e018})
/usr/lib/go/src/os/file.go:155 +0x1b0 io.copyBuffer({0x4bde38, 0xc00012e008}, {0x4bddb8, 0xc00012e018}, {0x0, 0x0, 0x0})
/usr/lib/go/src/io/io.go:413 +0x14b io.Copy(...)
/usr/lib/go/src/io/io.go:386 main.pipetest()
/home/stranger/source-code/golang/ipctest/pipes/main.go:39 +0x1ae main.main()
/home/stranger/source-code/golang/ipctest/pipes/main.go:10 +0x17
goroutine 18 [chan send]: main.pipetest.func1()
/home/stranger/source-code/golang/ipctest/pipes/main.go:29 +0x85 created by main.pipetest
/home/stranger/source-code/golang/ipctest/pipes/main.go:26 +0x17a exit status 2


正确答案


io.copy 不断尝试复制,直到读取器到达 eof(在本例中,当管道关闭时)。由于您在 io.copy 结束后调用 writer.close() after ,因此 io.copy 将永远不会看到 eof,并永远挂起。

代码的另一个问题是您尝试多次关闭管道(每次循环代码重复时)。一般情况下,closeable 对象只应关闭一次,并且在 closed 后被假定为不可用。如果您需要重新使用它们,您应该创建一个新实例。

这是代码的工作修订版:

func main() {
    c := make(chan string)

    go func() {
        for i := 0; i < 5; i++ {
            text := fmt.Sprintf("hello %vth time", i+1)
            c <- text
        }

        close(c)
    }()

    for msg := range c {
        msg = fmt.Sprintf("\nreceived from channel -> %v\n", msg)

        // Create a new pipe for this message.
        reader, writer := io.Pipe()
        go func() {
            fmt.Fprint(writer, msg)
            // Close the pipe after writing the message.
            writer.Close()
        }()

        io.Copy(os.Stdout, reader)
    }
}

以上就是尝试写入/读取时 io.Pipe 和死锁的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 尝试写入/读取时 io.Pipe 和死锁

本文链接: https://lsjlt.com/news/561385.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 尝试写入/读取时 io.Pipe 和死锁
    问题内容 我花了几个小时尝试理解底层逻辑,但没有任何进展。下面的代码在第一次迭代后返回死锁。如果我在 io.copy 之前关闭 writer,死锁就会消失,但不会打印任何内容(因为管道...
    99+
    2024-02-06
  • Java 重入锁和读写锁怎么使用
    这篇文章主要介绍“Java 重入锁和读写锁怎么使用”,在日常操作中,相信很多人在Java 重入锁和读写锁怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java 重入锁和读写锁怎么使用”的疑惑有所帮助!...
    99+
    2023-06-08
  • Python读取和写入文件
    #Read and Write from Files##coding=utf-8import codecsf = open("AccountList.txt","w")L = u"张三\n李四\n王五\n赵六"f.write(L)f.clo...
    99+
    2023-01-31
    文件 Python
  • Java 重入锁和读写锁的具体使用
    目录重入锁 1. 实现重进入 2. 公平与非公平获取锁的区别 读写锁 1. 接口示例 2. 读写状态的设计 3. 写锁的获取与释放 4. 读锁的获取与释放 5. 锁降级 重入锁 重...
    99+
    2024-04-02
  • 【PHP】文件写入和读取详解
    一.实现文件读取和写入的基本思路: 1.通过fopen方法打开文件:$fp =fopen(),fp为Resource类型 2.进行文件读取或者文件写入操作(这里使用的函数以1中返回的$fp作为参数)   调用fclose($fp)关闭关闭...
    99+
    2023-09-02
    php 数学建模 开发语言
  • Python中文件的读取和写入
    读取整个文件 这里假设在当前目录下有一个文件名为’pi_digits.txt’的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 with open('pi_digits.txt'...
    99+
    2023-01-31
    文件 Python
  • python文件怎么读取和写入
    这篇文章主要介绍了python文件怎么读取和写入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python文件怎么读取和写入文章都会有所收获,下面我们一起来看看吧。1、读取,read()方法返回文件中保存的字符...
    99+
    2023-06-30
  • C#怎么读取和写入文件
    在C#中,读取和写入文件通常使用System.IO命名空间中的File类。以下是一个简单的示例代码,展示了如何读取和写入文件: 读...
    99+
    2024-03-06
    C#
  • PHP读取和写入CSV文件的代码写
    这篇文章主要介绍“PHP读取和写入CSV文件的代码写”,在日常操作中,相信很多人在PHP读取和写入CSV文件的代码写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP读取和写入CSV文件的代码写”的疑惑有所...
    99+
    2023-07-06
  • Python如何读取和写入Excel数据
    这篇文章主要介绍“Python如何读取和写入Excel数据”,在日常操作中,相信很多人在Python如何读取和写入Excel数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何读取和写入Exce...
    99+
    2023-06-02
  • 如何在python中读取和写入文件
    这期内容当中小编将会给大家带来有关如何在python中读取和写入文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决...
    99+
    2023-06-14
  • C#中写入和读取TXT文件问题
    目录C#写入和读取TXT文件写入读取C#下xml读取和写入关于xml自定义xml文件读取XML代码写入XML代码总结C#写入和读取TXT文件 写入 /// <summary&g...
    99+
    2023-01-28
    C#写入TXT文件 C#读取TXT文件 C#文件写入读取
  • 如何用python读取和写入TIFF文件
    用python读取TIFF文件,可采用以下代码 framedim = [2048,2048] nb_elem = framedim[0]*frame...
    99+
    2023-01-31
    如何用 文件 python
  • 如何在Python中读取和写入文件?
    Python是一种流行的编程语言,它提供了各种功能,可用于处理文件。对于大多数应用程序,读写文件是必不可少的。在本文中,我们将介绍如何在Python中读取和写入文件。 一、文件的打开和关闭 在Python中打开文件使用内置函数open(),...
    99+
    2023-08-20
    文件 实时 接口
  • python中如何读取和写入CSV文件
    本文小编为大家详细介绍“python中如何读取和写入CSV文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中如何读取和写入CSV文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。CSV(Comma...
    99+
    2023-07-04
  • Cassandra怎么处理写入和读取操作
    Cassandra是一个分布式数据库系统,它使用了一种称为“分布式写入”和“分布式读取”的机制来处理写入和读取操作。 在Cassan...
    99+
    2024-04-09
    Cassandra
  • 在python中读取和写入CSV文件详情
    目录前言1.导入CSV库2.对CSV文件进行读写2.1 用列表形式写入CSV文件2.2 用列表形式读取CSV文件2.3 用字典形式写入csv文件2.4 用字典形式读取csv文件结语前...
    99+
    2024-04-02
  • Python怎么读取和写入操作CSV文件
    这篇文章主要介绍“Python怎么读取和写入操作CSV文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么读取和写入操作CSV文件”文章能帮助大家解决问题。什么是 CSV 文件?CSV...
    99+
    2023-06-29
  • Python怎么实现Excel数据读取和写入
    这篇“Python怎么实现Excel数据读取和写入”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么实现Exce...
    99+
    2023-06-30
  • 在python中怎么读取和写入CSV文件
    本篇内容介绍了“在python中怎么读取和写入CSV文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言CSV(Comma-Separat...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作