2024/8/28
laprasdrum.icon I'm almost 100%.
/icons/hr.icon
non-isolated functionからactor-isolated functionは呼び出せない
2024/8/24にconfirmation調査で見つけたrdarの記述について理解を深めたくて調べた。 code:Locked.swift
/// A type that wraps a value requiring access from a synchronous caller during
/// concurrent execution.
///
/// Instances of this type use a lock to synchronize access to their raw values.
/// The lock is not recursive.
///
/// Instances of this type can be used to synchronize access to shared data from
/// a synchronous caller. Wherever possible, use actor isolation or other Swift
/// concurrency tools.
///
/// This type is not part of the public interface of the testing library.
///
/// - Bug: The state protected by this type should instead be protected using
/// actor isolation, but actor-isolated functions cannot be called from
/// synchronous functions. (83888717(rdar://83888717)) struct Locked<T>: RawRepresentable, Sendable where T: Sendable {
この
この型によって保護される状態は、代わりにアクター分離を使用して保護されるべきですが、アクター分離された関数は同期関数から呼び出すことはできません。
という記述だが、synchronous = non-isolatedと解釈したうえで話を進める。
This has always been an error when attempting to modify an actor’s property from outside the actor context or from a nonisolated actor method.
はい、承知しました。AppleのSwiftチームによる講演の台本を要約し、重要なポイントと解説、そして詳細な例を日本語で提供いたします。
要約:
この講演は、Swift言語の並行処理モデルに焦点を当てており、特にデータ競合を排除するためのアプローチについて説明しています。主要な概念として、タスク分離、Sendableプロトコル、アクター、メインアクター、そして原子性について詳しく解説しています。また、Swiftコンパイラによる並行処理のチェック機能と、その段階的な導入方法についても触れています。
重要なポイントと解説:
1. タスク分離:
タスクは独立して動作する作業単位として表現されます。
各タスクは自己完結型で、他のタスクとは独立して動作します。
2. Sendableプロトコル:
データ競合を防ぐために導入された、安全に共有可能な型を示すプロトコルです。
値型は通常Sendableに準拠できますが、参照型は特定の条件下でのみ準拠可能です。
3. アクター:
共有可能な状態を安全に管理するための仕組みです。
アクター内の状態に同時にアクセスすることはできず、データ競合を防ぎます。
4. メインアクター:
UIに関連する作業を処理する特別なアクターです。
@MainActorアトリビュートを使用して、コードをメインアクターに分離できます。
5. 原子性:
アクターの操作は、中断されずに完了する必要があります。
非同期操作では、各awaitポイントでアクターの状態が適切であることを確認する必要があります。
6. 並行処理チェックの段階的導入:
Minimal、Targeted、Completeの3段階のチェックレベルが提供されています。
段階的に厳格なチェックを有効にすることで、データ競合のリスクを減らすことができます。
詳細な例:
1. Sendableプロトコルの使用例:
code:sample.swift
struct Pineapple: Sendable {
let weight: Double
let ripeness: Ripeness
mutating func slice() { /* ... */ }
mutating func ripen() { /* ... */ }
}
class Chicken { // Sendableではない
var name: String
var age: Int
func feed() { /* ... */ }
func play() { /* ... */ }
}
2. アクターの定義と使用例:
code:sample.swift
actor Island {
func advanceTime() {
// アクター分離されたメソッド
}
food.append(contentsOf: pineapples)
}
}
// アクターの使用
func depositPineapples(_ pineapples: Pineapple, on island: Island) async { await island.deposit(pineapples: pineapples)
}
3. メインアクターの使用例:
code:sample.swift
@MainActor
class ViewController: UIViewController {
func updateView() {
// UIの更新処理
}
}
// メインアクター外からの呼び出し
func updateUI(viewController: ViewController) async {
await viewController.updateView()
}
4. 並行処理チェックの設定例:
code:sample.swift
// ビルド設定でチェックレベルを指定
// SWIFT_STRICT_CONCURRENCY = complete
import FarmAnimals
@preconcurrency import LegacyModule
func doWork(body: @escaping () -> Void) {
DispatchQueue.global().async {
body() // 警告: 非Sendableなクロージャをキャプチャしています
}
}
// 修正版
func doWork(body: @escaping @Sendable () -> Void) {
DispatchQueue.global().async {
body() // OK
}
}
これらの概念と例を通じて、Swiftの並行処理モデルがどのようにデータ競合を排除し、安全な並行プログラミングを可能にしているかを理解することができます。
/icons/hr.icon
Actorは島でTaskはボート
I recommend you have another watch of the WWDC session (WWDC 2022 Session 110351 Eliminate data races using Swift Concurrency). In that analogy, actors are islands and task are boats (-:
iOSDC Japan 2024のTest関連発表
そういえばiOSDC Japan 2024でSwift Testingに触れてるLTが1件あった。
サバティカル休暇が気になる
会社員としてそういう休み方はないのかなと探したところ、サバティカル休暇というワードが目についた。
サバティカル休暇とは、一定の勤続年数(企業が定めた勤続年数)のある従業員に対して与えられる長期休暇のこと。福利厚生の一環として、企業が独自に定めることができる「特別休暇」の一つです。休暇期間は「1カ月」~「1年」程度が一般的ですが、中には「2年以上」の休暇取得を認めている企業もあります。
1880年に米ハーバード大学で導入された研究目的での有給休暇制度が起源とされ、1990年代になると離職防止策として欧州企業で広まりました。日本では、各大学において教職員を対象としたサバティカル休暇の導入が進んでいます。
日本には長期休暇の制度化がないため、無給になる可能性もある。
海外ではサバティカル休暇取得中の手当支給を制度化している国もありますが、日本では現状、そのような制度を国として設けてはいません。そのため、各企業がどのように休暇制度を設計するかにもよりますが、休暇中は従業員の収入が減少する可能性があります。
一見すると、企業にとっては「人件費の一時的な削減」というメリットがあるように感じられるかもしれません。しかし、手当を一切支給しないとなると、サバティカル休暇の取得が社内に浸透せず、ただ制度を新設しただけで終わってしまう可能性があるため、慎重な検討が必要です。
業務引継ぎどうするかという話。海外だと「担当者は今休んでるから何も分からないよ」と当たり前のように言われるので引き継ぎがない場合もある。
先ほどメリットとして紹介したことの裏返しではありますが、サバティカル休暇を取得する従業員が担っていた業務をそれ以外の従業員に振り分ける必要があります。業務の引き継ぎや棚卸しなどによる業務標準化が行われなかったり、不十分だったりした場合には、現場に混乱が生じるでしょう。
その結果、「サバティカル休暇を取得していない従業員から不満の声が上がる」「長期休暇の取得は周囲の迷惑であるという風潮を生む」「退職者が増える」といった事態を引き起こす可能性があります。
また、サバティカル休暇を取得する従業員の業務内容・業務量によっては、業務の引き継ぎや棚卸しだけでは対策として不十分なケースも考えられるでしょう。
もちろん休暇取得者が復職したときのフォローも必要になる。このへん海外の適用企業はどうしてるんだろう。
先ほどデメリットとして紹介したように、サバティカル休暇を取得した従業員が職場に復帰した際になかなか環境に適応できないという状況が想定されます。復帰後にスムーズに業務に就けるよう、フォロー体制を整備しましょう。なお、フォロー体制の整備が不十分だった場合、サバティカル休暇を取得した従業員の離職リスクを高めることになりかねないため、注意が必要です。
復帰時のフォロー体制の具体例としては、「休暇の取得前後に、上長や人事担当者と面談の機会を設ける」「休暇取得前と同じ業務を担当できるようにする」「代わりに業務を担当していたメンバーが、業務状況や変更点を引継ぐ」などがあります。
国内にもいくつか事例あり。ただ取得条件が勤続年数だとなかなか厳しい。
LINEヤフー株式会社では、従業員が自らのキャリアや経験、働き方を見つめ直し、さらなる成長につなげることを目的に「サバティカル休暇」を導入。勤続10年以上の正社員は、2~3カ月の範囲での長期休暇を取得できます。なお、休暇期間のうち一定期間については、会社が支援金を支給しています。
ソニーグループでは、従業員の多様性のあるキャリアを支援することを目的に、「フレキシブルキャリア休職制度」という名のサバティカル休暇を導入。配偶者の海外赴任・留学に同行し、知見や語学・コミュニケーション能力の向上を図る場合、最長5年の休職が可能です。また、専門性の深化・拡大を目的に私費で就学する場合は、最長で2年休職できます。
とはいえ、いくら会社を休んだところで子供の世話は毎日あるので、家のことに気持ちが引っ張られ続きそうな予感がする。