从 MPSC 通道成功接收后进程永远不会退出

2023-12-11

这是代码:

use std::thread;
use std::sync::mpsc;

fn main() {

    //spawn threads 
    let (tx, rx) = mpsc::channel();
    for mut i in 0 .. 10 {
        let txc = tx.clone();   //clone from the main sender
        thread::spawn( move || {            
            i += 20;
            println!("Sending: {}", i);
            txc.send(i).unwrap_or_else(|e| {
                eprintln!("{}", e);
            });
        });
    }

    for received in rx {
        println!("Received: {}", received);
    }

}

代码成功运行,但它挂起并且进程最终永远不会退出。

我认为这可能与关闭频道结束有关,我尝试顺便过去tx.drop() and rx.drop()但编译器给出了错误。

我在这里做错了什么?


tx在你的主线程中直到结束才被删除main函数,以及rx在删除所有发件人之前不会关闭。

要解决此问题,您可以手动删除它drop(tx)启动所有线程后:

use std::thread;
use std::sync::mpsc;

fn main() {

    //spawn threads 
    let (tx, rx) = mpsc::channel();
    for mut i in 0 .. 10 {
        let txc = tx.clone();   //clone from the main sender
        thread::spawn( move || {            
            i += 20;
            println!("Sending: {}", i);
            txc.send(i).unwrap_or_else(|e| {
                eprintln!("{}", e);
            });
        });
    }

    // drop tx manually, to ensure that only senders in spawned threads are still in use
    drop(tx);

    for received in rx {
        println!("Received: {}", received);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 MPSC 通道成功接收后进程永远不会退出 的相关文章

随机推荐

  • 我怎样才能使 var a = add(2)(3); //5 工作?

    我想让这个语法成为可能 var a add 2 3 5 根据我读到的内容http dmitry baranovskiy com post 31797647 我不知道如何使其成为可能 您需要将 add 设为一个函数 该函数接受一个参数并返回一
  • Python中如何比较对象的类型?

    基本上我想这样做 obj str type obj string I tried type obj type string 但它不起作用 另外 其他类型呢 例如 我无法复制NoneType isinstance 就你而言 isinstanc
  • 在CodeIgniter 3中设置数据库连接超时

    我们正在使用 2 个数据库 本地数据库和外部数据库 但现在我们的外部数据库已关闭 我们仍在开发中 所以很高兴我们遇到了这个问题 并且它现在尝试连接到外部数据库 30 秒 我如何将数据库的连接超时更改为类似1 2 秒 我在数据库上使用 Cod
  • 如何制作可与默认 WCF 服务应用程序配合使用的 UWP

    如果您创建一个新项目 WCF 服务应用程序 C 它会创建一个 Web 服务并启动它 但是没有关于如何与客户端实际通信的信息 或者甚至如何编写它的信息 与该服务通信的 UWP 客户端是什么样的 如何制作可与默认 WCF 服务应用程序配合使用的
  • 在点击谷歌地图 javascript api 上放置标记

    我在 JS Apis 中编写了谷歌地图 我想要实现的是 无论用户点击哪里 它都会将标记放置在那里并输出其纬度和经度 我所实现的是 无论我点击哪里 它都会输出纬度和经度 而无需将标记拖到那里 这里是小提琴 google maps event
  • Ruby On Rails - 同一张表之间的多对多

    我试图在 Rails 中创建一个有点复杂的关系 但在寻找最佳方法时遇到了一些困难 我有一个用户表 其中每个用户充当教师和学生 我想要有一个 has many 学生 也只是用户 和一个 has many 老师 也只是用户 我不想进行任何子类化
  • TR 中是否存在 ImageTag?

    EDIT public bool getImage IWebElement table driver FindElement By Id DIV ID 1 string name String Format contains text 0
  • 如何获取用户在 django Guardian 中具有特定权限的所有对象?

    我目前正在对所有对象进行非常笨拙的循环 但这会变得很慢 videos Video objects all video list for video in videos checker ObjectPermissionChecker requ
  • WPF 使用转换器更改数据网格单元格背景颜色

    我有一个 WPF 数据网格 我需要比较两列日期时间类型 根据比较结果 我为当前列和行中的两个单元格设置单元格背景颜色 我对每个数据网格行执行此操作 为了做到这一点 我使用转换器
  • 在命令提示符中 PHP 未被识别为内部或外部命令

    当我运行命令时出现以下错误php C xampp htdocs gt php php is not recognized as an internal or external command operable program or batc
  • 找不到 webdriverprefs.json - pyinstaller

    我有一个使用 selenium 包的 python 程序 当使用它创建 exe 时pyinstaller它正确创建了exe 当尝试从此应用程序打开 Firefox 时 出现以下错误 IOError Errno 2 No such file
  • 传递多个值到 switch,用逗号分隔值

    我可以将多个值传递给 switch case 语句并用逗号分隔不同的值吗 该表达式的计算结果是什么 如果没有发生错误 编译器将使用多个值中的哪一个来评估开关 还记得逗号运算符的低优先级吗 比如说我写的代码如下 int m 10 switch
  • 使用 Firebase Android 排序数据

    我遇到了一个奇怪的问题 其中 Firebase 查询使用orderByChild 实际上并不对数据进行排序 以下是我尝试订购的数据的快照 出于本示例的目的 总计已关闭 这是我到目前为止使用过的代码 Query query locationC
  • 将 Docker 部署到 AWS Elastic Beanstalk — 如何将端口转发到主机? (端口绑定)

    我有一个用 CircleCI 设置的项目 我用它来自动部署到 Elastic Beanstalk 我的 EBS 环境是单个容器 自动扩展的 Web 环境 我正在尝试运行一个侦听原始套接字端口 8080 的服务 我的 Dockerfile F
  • jQuery - 如果选择了 > 1 个复选框,如何显示消息?

    取决于数量n用户的记录中拥有的汽车数量 将会有n可供选择的复选框 在我看来 这些复选框是使用循环呈现的 如果用户选择 gt 1 个复选框 我想显示一条消息 所以 x Honda Toyota Suzuki no message shown
  • 查询父模型时可以过滤关系的内容吗?

    我有两个代表电影及其放映时间的模型 我想查询所有电影 但他们show times关系应该只包含未来的那些表演时间 class PKMovie db Model id db Column db Integer primary key True
  • C# winforms 中表单之间传递数据的最安全方法

    我试图记住我在学校简要学到的关于在 winform 之间安全传递数据的一课 我的导师叫它流水线 尽管我不确定这是正确的术语还是仅仅是他自己的名字 他表示 他的方法比公开数据以便所有人都可以访问数据的最简单方法更安全 他说这更安全 因为他的方
  • 在 test.each 中使用变量表达式 Jest

    下面是我的代码片段 describe Upper Describe gt let value beforeEach gt value require testModule value it each value test something
  • 在 R 中解析 XML 文件(>1 MB)

    目前 我有大约 20 000 个 XML 文件 大小从几 KB 到几 MB 不等 虽然它可能并不理想 但我使用 XML 包中的 xmlTreeParse 函数来循环遍历每个文件并提取我需要的文本并将文档保存为 csv 文件 下面的代码适用于
  • 从 MPSC 通道成功接收后进程永远不会退出

    这是代码 use std thread use std sync mpsc fn main spawn threads let tx rx mpsc channel for mut i in 0 10 let txc tx clone cl