首页 > 解决方案 > Swift 相当于 Ruby 的 Concurrent::Event?

问题描述

流行的 Concurrent-Ruby 库有一个我觉得很棒的Concurrent::Event类。它非常巧妙地封装了“一些线程需要等待另一个线程完成某事才能继续执行”的思想。</p>

只需三行代码即可使用:

您需要使用其他并发原语来创建它的所有锁和布尔值都会为您处理好。

引用一些文档以及示例用法:

老派内核风格的事件让人想起 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 有类似的东西吗?

标签: iosswiftmultithreadingconcurrency

解决方案


我认为最接近这一点的是async/awaitSwift 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)

推荐阅读