ios - Swift 相当于 Ruby 的 Concurrent::Event?
问题描述
流行的 Concurrent-Ruby 库有一个我觉得很棒的Concurrent::Event
类。它非常巧妙地封装了“一些线程需要等待另一个线程完成某事才能继续执行”的思想。</p>
只需三行代码即可使用:
- 一、创建对象
- 一个打电话
.wait
开始等待,和 .set
东西准备好了就打电话。
您需要使用其他并发原语来创建它的所有锁和布尔值都会为您处理好。
引用一些文档以及示例用法:
老派内核风格的事件让人想起 C++ 中的 Win32 编程。
创建an 时
Event
,它处于unset
状态。线程可以选择#wait
对事件进行阻塞,直到被另一个线程释放。当一个线程想要提醒所有阻塞线程时,它#set
会调用该方法,然后唤醒所有侦听器。一旦Event
设置了它,它就会保持设置。新线程调用#wait
将立即返回。require 'concurrent-ruby' event = Concurrent::Event.new t1 = Thread.new do puts "t1 is waiting" event.wait puts "event ocurred" end t2 = Thread.new do puts "t2 calling set" event.set end [t1, t2].each(&:join)
打印输出如下
t1 is waiting
t2 calling set
event occurred
(因为它是多线程的,所以可能有几种不同的顺序,但 't2 调用集' 总是在 '事件发生' 之前出现。)
iOS 上的 Swift 有类似的东西吗?
解决方案
我认为最接近这一点的是async/await
Swift 5.5 中的新语法。没有等效的event.set
, 而是await
等待异步完成。并发的一个特别好的表达是async let
,它同时进行,但随后让您暂停以收集所有async let
调用的结果:
async let result1 = // do something asynchronous
async let result2 = // do something else asynchronous at the same time
// ... and keep going...
// now let's gather up the results
return await (result1, result2)
推荐阅读
- html - 如何使父子div具有相同的响应高度
- python - 如何将带有列表和整数的列表添加到csv中?
- javascript - 如何让 Javascript 在发送请求之前等待 Promise?
- javascript - JS fetch - 数据消失或无限循环
- bash - 打开终端并运行命令的脚本
- windows - 尝试使用 powershell 将日志文件的最后 10 行连接到批处理变量
- c# - 我可以更改 Visual Studio 项目类型中默认文件的内容吗?
- javascript - 谷歌应用脚本查找值然后复制整行
- javascript - 在javascript中以英寸为单位获取屏幕尺寸
- java - 我从注册面板获取空值到我的数据库