rust - 您如何等待分离的线程或控制线程的产生方式?
问题描述
当spawn
被调用时, aJoinHandle
返回,但如果该句柄被丢弃(或不可用,在板条箱内的某处),则线程被“分离”。
有什么方法可以找到当前正在运行的所有线程并JoinHandle
为它们恢复一个?
...我的感觉是,总的来说,答案是否定的。
在这种情况下,是否有任何方法可以覆盖全局Thread
调用方式或JoinHandle
删除方式?
...但是查看源代码,我看不出有任何可能。
作为动机,这个非常长的讨论建议使用范围来强制终止子线程;join
当作用域结束时,在每个子线程上有效地执行 a 。但是,它需要通过自定义方法生成子线程才能工作;能够在 Rust 中做类似的事情会非常有趣,其中任何产生的线程都被拦截并作为 threadlocal 上活动环境范围的父级。
我会接受任何答案:
- 演示如何
JoinHandle
通过任何可能的方式恢复 - 演示如何以
thread::spawn()
某种方式覆盖的行为,以便JoinHandle
在某个任意子函数中调用的线程中丢弃的对象可以在被删除之前恢复。
解决方案
有什么方法可以找到当前正在运行的所有线程并
JoinHandle
为它们恢复一个?
不,这可能会对想要使用线程的每个人施加限制/开销,这与系统编程语言是对立的。
您可以为此编写自己的解决方案,方法是使用Arc
/Weak
和全局单例。然后你就有了自己的线程注册表。
有什么方法可以覆盖全局
Thread
的调用方式或JoinHandle
删除方式?
不,现在存在的 Rust 库无法做到这一点。事实上,在这种规模上“覆盖”某些东西与静态编译语言的概念是完全对立的。想象一下,如果您使用的任何库可以决定“覆盖”加法的工作方式或做了什么println
。有些语言确实允许这种动态性,但这是有代价的。Rust 不是正确的语言。
事实上,正确的解决方案并不是什么新鲜事:只需使用依赖注入。“启动线程”是一个重要的协作者,可能不属于大多数库的范围,因为它是一个应用程序范围的资源。
可以在掉落之前恢复
在 Rust 中,值在它们最后一次使用的范围的末尾被删除。这将需要在程序中任何位置的任意函数的序言处运行任意代码。这样的功能极不可能实现。
有一些关于创建一个方法的讨论,该方法将返回一个句柄,当它被删除时加入线程,这可能会做你想要的,但人们仍然必须调用它。
推荐阅读
- python - 除了 ScatterPlot,DBSCAN 是否还有其他形式的可视化?
- mongodb - 使用 Mongo 和 SpringData 读取过时的数据
- android - 导入android支持库
- c# - 使用 + 和 - C# 的数字的所有组合
- php - 我正在使用 laravel 5.3 ,使用 MAMP 作为服务器,我的 php 版本是 7.4.1
- terraform - 使用 Terraform 在 GCP 中的 Stackdriver“警报和通知”
- python - 代码不执行功能,尽管没有错误消息,我做错了什么?| Python
- mysql - Sequelize MySQL Migration - false 独有
- android - 多个异常:无法启动活动、无法实例化片段、错误膨胀类
- python - 获取在另一个模型中有条目的所有对象