์ด๋ฒ ์ธ์ ์๋ await/async ์ ์ด์ด ์๋กญ๊ฒ ๋ฑ์ฅํ Actor ํ์ ์ ๋ํด ์์ธํ ์๊ฐํฉ๋๋ค !!
https://developer.apple.com/videos/play/wwdc2021/10133/
Actor in swift
์ฒซ๋ฒ์งธ๋ก, actor๊ฐ ๋ฑ์ฅํ๊ฒ ๋ ์ด์ ์ ๋ํด ์๊ฐํฉ๋๋ค.
concurrent ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ๊ณ ๋ คํด์ผ ํ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ค ํ๋๋ data racing์ ํผํ๋ ๊ฒ์ด์ฃ . data racing์ ๋ ์ฐ๋ ๋๊ฐ ๋์์ ๊ฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผ์ and ๋ ์ค ํ๋๊ฐ ์ฐ๊ธฐ ์์ ์ ํ๊ณ ์์๋ ๋ฐ์ํฉ๋๋ค.
์๋ ์์ข์ ์์ ์ฝ๋๋ฅผ ๋ด ์๋ค.
์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ 1, 2 ๋๋ 2,1์ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค. ์ด๊ฒ์ counter๊ฐ ์์ ์ ์ธ state์ ๋จ๊ฒจ์ ธ ์์๋ ๊ฒฝ์ฐ์ ๋๋ค.
ํ์ง๋ง ๋ task ๋ชจ๋ 0์ ์ฝ๊ณ 1์ ์จ์ 1,1์ ๊ฒฐ๊ณผ๊ฐ์ ์ป์ ์๋ ์๊ณ ๊ฐ์ด ์ฆ๊ฐ๋ ํ์ return๋๋ค๋ฉด ๋๋ค 2, 2๋ฅผ ์ฝ์ ์๋ ์์ต๋๋ค.
data racing์ ํผํ๊ณ ๋๋ฒ๊ทธํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ธฐ๋ก ์
๋ช
์ด ๋์ต๋๋ค.
data racing์ shared mutable state์ ์ํด ๋ฐ์๋ฉ๋๋ค.(์ ์์์์๋ value state๊ฐ ๋ ๊ฒ์ ๋๋ค.)
๋ง์ฝ data๊ฐ ๋ณํํ์ง ์๊ฑฐ๋ ์ฌ๋ฌ concurrent task์ ๊ณต์ ๋์ง ์๋๋ค๋ฉด data racing์ด ๋ฐ์ํ์ง ์์ ๊ฒ์
๋๋ค.
data racing์ ํผํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ value semantics๋ฅผ ์ฌ์ฉํด shared mutable state๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์
๋๋ค. ๋ค์ํ value type๊ณผ ํจ๊ป ๋ชจ๋ mutation์ ์ง์ญ์ ์
๋๋ค. ๋์ฑ์ด let value semantic ํ์
์ ํ๋กํผํฐ๋ immutableํ๋ฏ๋ก ๋ค๋ฅธ concurrent task๋ก๋ถํฐ ์์ ํฉ๋๋ค.
์์๋ฅผ ๋ด
์๋ค. array1์ int ํ์
์ array์
๋๋ค. ๊ทธ๋ฆฌ๊ณ array2์ ์ฒซ๋ฒ์งธ array1 ๊ฐ์ copyํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ฐฐ์ด์ ๊ฐ์ append ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๋ ฅํด๋ณด๋ฉด ?
//array1 = [1,2,3]
//array2 = [1,2,4]
๊ฐ ํ ๋น ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ฉด value type์ธ struct๋ก ๋ฐ๊พธ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์ ? ๋ํ increment ํจ์๋ฅผ mutating์ผ๋ก ๋ฐ๊พธ์์ต๋๋ค.
ํ๋ญ ๊ทธ๋ฌ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
counter๊ฐ let์ด๊ธฐ ๋๋ฌธ์ด์ฃ . ๊ทธ๋์ let์ var๋ก ๋ฐ๊พผ๋ค๋ฉด counter๊ฐ ๋ concurrent task์ ์ํด ์ฐธ์กฐ๋๊ธฐ ๋๋ฌธ์ ๋ค์ race condition์ด ๋ฐ์ํ ๊ฒ์
๋๋ค.
๋คํ์ด๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ถ์์ ํ ์ฝ๋์ ๋ํด ์๋ฌ ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ฐ๋ผ์ ๊ฐ concurrent task์ ๋ํด ๋ก์ปฌ mutable ๋ณ์๋ฅผ ๋ด๋ถ์ ๋ฃ์ด์ค์ผ๋ก์(์ง์ญ์ ์ผ๋ก) ํด๊ฒฐ ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์คํํ๋ฉด ๊ฐ concurrent task์ ๋ํด ํญ์ 1์ ํ๋ฆฐํธํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์ ์ฝ๋๋ ์ด์ race condition์ผ๋ก๋ถํฐ ์์ ๋กญ์ง๋ง ๊ทธ ํ๋์ ๋ ์ด์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ด๊ฒ์ ๊ณต์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์ฌ์ ํ ์์์ ๋ณด์ฌ์ค๋๋ค.
์ฐ๋ฆฌ์ concurrent ํ๋ก๊ทธ๋จ์ shared mutable state๊ฐ ์์๋ ์ด๊ฒ์ด race condition์ด ๋์ง ์๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด synchronization์ ํํ๋ฅผ ํ์๋ก ํฉ๋๋ค.
atomic๊ณผ locks๊ณผ ๊ฐ์Low level tool๋ก๋ถํฐ serial dispatch queue์ ๊ฐ์ ๊ณ ์์ค์ construct๊น์ง synchronization๋ฅผ ์ํ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ๊ฐ๊ฐ์ ๋ค์ํ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ง๋ง ๋ชจ๋ ๋์ผํ ์น๋ช ์ ์ธ ์ฝ์ ์ ๊ณต์ ํฉ๋๋ค. ๋งค๋ฒ ์ ํํ ์ ํํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์ฌํ ํ๋ จ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ ๊ฒฝ์์ผ๋ก ๋๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก Actor๊ฐ ๋ฑ์ฅํฉ๋๋ค. Actor๋ swift๋ฅผ ์ํ ์๋ก์ด ํ์
์
๋๋ค.
๊ทธ๋ค์ Swift์ ๋ชจ๋ ์ด๋ฆ์ ๊ฐ์ง type๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
actor๋ properties, methods, initializer, subscripts ๋ฑ๋ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค. protocol๋ฅผ ์์ํ๊ฑฐ๋ extension์ ๊ฐ์ง ์ oo
๋ํ class์ ๊ฐ์ด reference type์ ๋๋ค. ํ์ง๋ง ์์ ์ง์ x
actor์ ๋ชฉ์ ์ผ๋ก shared mutable state๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ค์ ๋ก actor type์ ์ฃผ์ ๊ตฌ๋ณ๋๋ ํน์ง์ ์ธ์คํด์ค ๋ฐ์ดํฐ๋ฅผ ํ๋ก๊ทธ๋จ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋ถ๋ฆฌํ๊ณ ํด๋น ๋ฐ์ดํฐ์ ๋ํ ๋๊ธฐํ๋ ์ก์ธ์ค๋ฅผ ๋ณด์ฅํ๋ค๋ ๊ฒ์
๋๋ค.
์์๋ฅผ ๋ด
์๋ค. ์ฌ๊ธฐ์๋ actor type์ Counter๊ฐ ์์ต๋๋ค.
struct์ class์์ ์ฐจ์ด์ ์ actor๋ value๊ฐ ๋์์ ์ผ๋ก ์ ๊ทผ๋์ง ์์์ ๋ณด์ฅํ๋ค๋ ๊ฒ์
๋๋ค.
์ด ์์์์ increment ๋ฉ์๋๋ ํธ์ถ๋ ๋ actor์์ ์คํ๋๋ ๋ค๋ฅธ ์ฝ๋์์ด ํธ์ถ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ actor state์ ๋ํ ์ ์ฌ์ ์ธ data race๊ฐ ์์์ ๋ณด์ฅํ๊ฒ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ์ counter์ increment ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ concurrent task๊ฐ ์์ต๋๋ค.
์กํฐ์ ๋ด๋ถ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํ๋์ increment ํธ์ถ์ด ๋ค๋ฅธ ํธ์ถ์ด ์์๋๊ธฐ ์ ์ ์๋ฃ๋ ๋๊น์ง ์คํ๋๋๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฐ๋ฆฌ๋ 1 -> 2 ๋๋ 2 -> 1์ ๊ฐ์ ์ป์ ๊ฒ์
๋๋ค.
์ด๋ป๊ฒ ๋๋ฒ์งธ task๊ฐ ์ ์ฌ์ ์ผ๋ก actor์ ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋ณด์ฅ ํ ์ ์์๊น์ ? swift๋ ์ด์ ๋ํ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด resetSlowly ๋ฉ์๋๋ ์นด์ดํฐ ์กํฐ ์ ํ์ ํ์ฅ์ ์ ์๋์ด ์์ผ๋ฏ๋ก ์กํฐ ๋ด๋ถ์ ์์ต๋๋ค. ์ฆ, ์นด์ดํฐ ๊ฐ์ 0์ผ๋ก ์ฌ์ค์ ํ๊ธฐ ์ํด ์ํํ๋ ์กํฐ์ ์ํ์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
Actor์์ ์คํ ์ค์์ ์ด๋ฏธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๊ธฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ actor์ ์ค์ํ ํน์ง์
๋๋ค.
Actor์ ๋๊ธฐ ์ฝ๋๋ ์ค๋จ ์์ด ํญ์ ์๋ฃ๋ ๋๊น์ง ์คํ๋ฉ๋๋ค.
๋๊ธฐ ์ฝ๋๋ ์ค๋จ ์์ด ์คํ๋์ง๋ง Actor๋ ์ข
์ข
์๋ก ๋๋ ์์คํ
์ ๋ค๋ฅธ ๋น๋๊ธฐ ์ฝ๋์ ์ํธ ์์ฉํ๋ค๊ณ ๊ฐ์กฐํ์ต๋๋ค.
๋น๋๊ธฐ ์ฝ๋์ Actor์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
ImageDownloader actor์ ๋ํด ์์๋ฅผ ๋ด ๋ด
์๋ค. ์ด๋ฏธ ๋ค์ด๋ก๋ ๋ image๊ฐ ์๋ค๋ฉด cache์์ ๋ฆฌํดํ๋๋ก ํ๋ฉฐ ์๋ค๋ฉด ๋ค์ด๋ก๋ ๋ image๋ฅผ cache์ ์ ์ฅํ์ฌ ๋ฆฌํดํ๋๋ก ํ๊ณ ์์ต๋๋ค.
์กํฐ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํ ๋ฒ์ ํ๋์ ์์
๋ง ์บ์ ์ธ์คํด์ค ์์ฑ์ ์ก์ธ์คํ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ๋ณด์ฅํ๋ฏ๋ก ์บ์๊ฐ ์์๋ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ฆ ์ฌ๊ธฐ์ await ํค์๋๋ await๊ฐ ๋ฐ์ํ ๋๋ง๋ค downloadImageํจ์๊ฐ ์ด ์์ ์ ์ค๋จ๋ ์ ์์์ ๋ํ๋
๋๋ค. ๋ฐ๋ผ์ CPU๊ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์๋๋ก ์ ์ ๋๋์ฃ . ํจ์๊ฐ ๋ค์ ์ฌ๊ฐ๋๋ฉด ์ ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ state๊ฐ ๋ณ๊ฒฝ ๋์ด ์์์ง๋ ๋ชจ๋ฆ
๋๋ค.
Await ํ์ ์ ์ง๋์ง ์์ ์ ์๋ await ์ด์ ์ํ์ ๋ํด ๊ฐ์ ํ์ง ์์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋์์ ๊ฐ์ image๋ฅผ ๊ฐ์ ธ์ค๋ ๋ ๋ค๋ฅธ concurrent task๋ฅผ ๊ฐ์ง๊ณ . ์๋ค๊ณ ์์ํด๋ด
์๋ค.
์, ์ฒซ๋ฒ์งธ Task1์ cache ์ ์ฅ์์ image๊ฐ ์์์ ํ์ธํ๊ณ downloadImageํ๊ธฐ ์์ํฉ๋๋ค.
downloadImage ํจ์๋ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ suspend๋ฉ๋๋ค.
์ฒซ๋ฒ์งธ Task1๊ฐ image๐ธ๋ฅผ ๋ค์ด๋ก๋ ํ๋ ๋์ค ์ ์ด๋ฏธ์ง๐ฟ๊ฐ ๊ฐ์ url๋ก ์๋ฒ์ ์ ์ฉ๋ ์ ์์๊ฒ์ ๋๋ค.
์ ์ด์ task2๊ฐ image๋ฅผ ๊ฐ์ ธ์ค๊ธธ ์๋ํฉ๋๋ค. ์์ง task1์์ ์ด๋ฏธ์ง ๋ค์ด๋ก๋๊ฐ ๋๋์ง ์์๊ธฐ ๋๋ฌธ์, cache ๋์ ๋๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ task2 ์ญ์ downloadImageํ๋ ๋์ suspend ๋ฉ๋๋ค.
๊ทธ ํ์ ์ฒซ๋ฒ์งธ task1์ด ๋ค์ด๋ก๋๋ฅผ ๋ง์น๊ณ actor์์ ์คํ์ ์ฌ๊ฐํฉ๋๋ค.
cache์ ๋ฐ์์จ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ณ return ํ๊ฒ ์ฃ ?
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ task2 ์ญ์ ๋ค์ด๋ก๋๋ฅผ ๋ง์น๊ณ url์ image๋ฅผ ์ ์ฅํ๊ณ return ํ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฒซ๋ฒ์งธ task1์ ํตํด ์ด๋ฏธ image๋ฅผ cache์ ์ ์ฅํ์์๋ ๋ถ๊ตฌํ๊ณ task2๊ฐ image๋ฅผ ๋ค์ํ๋ฒ ๊ฐฑ์ ํ๋ฉด์ ๋๋ฒ์ ๋คํธ์ํฌ ํธ์ถ์ด ๋ฐ์ํ์ต๋๋ค.
Await ํค์๋์ ํจ๊ป ์ ์ฌ์ ์ธ bug๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ ํ๊ธฐ ์ํด์ await ํ ๊ฐ์ ์ ํ์ธํ๋ ๊ฒ์
๋๋ค.
task๋ฅผ ์ฌ๊ฐ(resume)ํ ๋, cache์ ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์๋ image์ ์ ์งํ๊ณ ์ image์ ๋ฒ๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ข์ ์๋ฃจ์
์ ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ์์ ํ ํผํ๋ ๊ฒ์
๋๋ค.
actor์ ์ฌ์ง์
์ ๊ต์ฐฉ ์ํ๋ฅผ ๋ฐฉ์งํ๊ณ ์์ผ๋ก์ ์งํ์ ๋ณด์ฅํ์ง๋ง ๊ฐ ๋๊ธฐ์์ ๊ฐ์ ์ ํ์ธํด์ผ ํฉ๋๋ค.
์ฌ์ง์
์ ์ํ ๋์์ธ์ ํ๊ธฐ ์ํด์ ๋๊ธฐ ์ฝ๋ ์์์ actor state์ mutation์ ์ํํฉ๋๋ค. state mutation์ ์ผ์์ ์ผ๋ก actor๋ฅผ ์ผ๊ด์ฑ ์๋ ์ํ๋ก ๋ง๋๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
await ์ ์ ์ผ๊ด์ฑ์ ๋ณต์ํด์ผ ํฉ๋๋ค. await๋ ์ ์ฌ์ ์ธ suspension point์์ ๊ธฐ์ตํ์ญ์์ค. ๋ง์ฝ ์ฝ๋๊ฐ suspend๋๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ์ฝ๋๊ฐ ์ฌ๊ฐ๋๊ธฐ ์ ๊น์ง ์์ง์ผ ๊ฒ์
๋๋ค. ์ ์ญ sate, clock, timer ๋๋ actor์ ๋ํด ๋ง๋ ๋ชจ๋ ๊ฐ์ ์ await ํ์ ํ์ธํด์ผ ํฉ๋๋ค.
Actor isolation์ actor type์ ํ๋์ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ๊ฒ์
๋๋ค.
LibraryAccount actor์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค
== ๋ฉ์๋๋ static ํ์
์ผ๋ก actor์ isolate๋์ง ์์ต๋๋ค. Equatable ํ๋กํ ์ฝ์ ์์ํ๋ == ๋ฉ์๋๋ actor type์ ๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉฐ ์ด static ๋ฉ์๋๋ ๋ ๋ค ์ธ๋ถ์ ์์ต๋๋ค. actor์ ์ค์ง immutable state๋ง ์ ๊ทผํ๊ณ ์์ผ๋ฏ๋ก ๊ด์ฐฎ์ต๋๋ค.
(isolate๋ผ๋ ์๋ฏธ๊ฐ ์ง์ญ์ (local)? ์ด๋ ์ผ๋งฅ์ํตํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค .. ๐ค)
์ด๋ฒ์ Hashable ํ๋กํ ์ฝ์ ์์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ด ์๋ค. Hashable์ hash ํจ์ ๊ตฌํ์ ํ์๋ก ํ๋๋ฐ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค์. Hashable์ ์์ํ๋ ์ด actor๋ actor ๋ฐ์์ ์ด ํจ์๊ฐ ํธ์ถ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ํ์ง๋ง hashํจ์๋ asyncํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก actor isolation์ ์ ์งํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์์ ํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ํจ์๋ฅผ non-isolation์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
isolation์ ๋ํ ๊ฐ๋ ์ด ํท๊ฐ๋ ค zedd๋ ์ ๋ฆฌ ๊ธ์ ์ฐธ๊ณ ํ์ต๋๋ค -> https://zeddios.tistory.com/1303
actor๋ด์ ์ ์๋
- stored, computed instance properties
- instance methods
- instance subscripts
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ actor-isolated ์ํ์ด๋ค.
ํน1. actor-isolated ์ ์๋ค์ ๋ค๋ฅธ actor-isolated ์ ์๋ค์ ์์ ๋กญ๊ฒ ์ฐธ์กฐ ํ ์ ์๋ค.
ํน2. actor-isolated๊ฐ ์๋ ์ ์๋ค์ actor-isolated ์ ์๋ค์ ๋๊ธฐ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ ์์์์ func hash()๋ actor-isolated์ธ๋ฐ actor-non-isolated์ธ Hasher์์ actor-isolated์ธ idNumber์ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ด์ง์ ! ๋ค์ ์ด์ด๊ฐ๋ด ์๋ค.
Non-isolated๋ actor ์ธ๋ถ์ ์๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ actor์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. nonisolated ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์ด ๋ฉ์๋๋ ๋ณ๊ฒฝํ ์ ์๋ idNumber๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.
๋ค๋ฅธ ํ๋กํผํฐ๋ก hashํ๊ธธ ์๋ํ๋ค๋ฉด ์๋ฅผ ๋ค์ด booksOnLoan๊ณผ ๊ฐ์ ํ๋กํผํฐ๋ก ๋ง์ด์ฃ . ๊ทธ๋ ๋ด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ํ๋ฉด mutable state(var)์ ๋ํ ์ ๊ทผ์ data race๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์
๋๋ค.
์, ํด๋ก์ ์ ๋ํด ์๊ธฐํด๋ด ์๋ค. ํจ์์ ๊ฐ์ด ํด๋ก์ ๋ isolated ๋ ์๋ non-isolated ๋ ์๋ ์์ต๋๋ค.
readSome ํด๋ก์ ๋ read()๋ผ๋ actor-isolated ํจ์์์ ๋ง๋ค์ด์ง ํด๋ก์ ์ด๊ธฐ ๋๋ฌธ์ ์ญ์ actor-isolated์ด๋ฉฐ await๊ฐ ์์์ ์ฃผ๋ชฉํ์๊ธธ ๋ฐ๋๋๋ค.
๋ ๋ค๋ฅธ ์์๋ฅผ ๋ด
์๋ค. Task.detached๋ actor๊ฐ ์ํํ๋ ๋ค๋ฅธ ์์
๊ณผ ๋์์(async) ํด๋ก์ ๋ฅผ ์คํํฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก read()๋ actor์์ ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด ํด๋ก์ ๋ non-isolated์
๋๋ค.
Read ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธธ ์ํ ๋, await๋ฅผ ๋ถ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถ๋๋๋ก ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ฝ๋๊ฐ actor์ ๋ฐ์์ ์คํ๋๋์ง ์๋๋ฉด ์์์ ์คํ๋๋์ง์ ๋ฐ๋ผ isolation์ ๋ํด ์ด์ผ๊ธฐ ํ์ต๋๋ค. ์ด๋ฒ์๋ actor isolation๊ณผ data์ ๋ํด ์ด์ผ๊ธฐ ํด๋ด ์๋ค.
Book์ structํ์
์
๋๋ค. ์ด๋ LibaryAccount actor์ ์ธ์คํด์ค์ ๋ํ ๋ชจ๋ ์ํ๊ฐ ์์ฒด ํฌํจ๋จ์ ์๋ฏธํฉ๋๋ค. (๊ฐ ๋ณต์ฌ ํ์
์ผ๋ฏ๋ก ) ๋ฐ๋ผ์ ๊ณ์ํด์ ์ด ๋ฉ์๋(visit)๋ฅผ ํธ์ถํ์ฌ ์ฝ์ ์ฑ
์ ๋ฌด์์๋ก ์ ํํ๋ฉด ์ฝ์ ์ ์๋ ์ฑ
์ ๋ณต์ฌ๋ณธ์ ์ป๊ฒ ๋ฉ๋๋ค.
์ฑ
์ฌ๋ณธ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ actor์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
ํ์ง๋ง Book์ class ํ์
์ผ๋ก ๋ง๋ ๋ค๋ฉด, ๋ฌ๋ผ์ง๋ ์ ์ด ์์ต๋๋ค.
LibraryAccount actor๋ ์ด์ Book class์ ์ฐธ์กฐํ์
์
๋๋ค.
ํ์ง๋ง ๊ทธ ์์ฒด๋ก ๋ฌธ์ ๋ ์๋์ง๋ง, selectRandomBook() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฌด์จ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊น์ ? Mutable state์ actor์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ actor์ ๋ฐ์์ ๊ณต์ ๋์ด์ง๋๋ค. ์ด๊ฒ์ ์ ์ฌ์ ์ธ data race condition์ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด์ ์ฑ
์ ์ ๋ชฉ์ ์
๋ฐ์ดํธํ๋ฉด ์กํฐ ๋ด์์ ์ก์ธ์คํ ์ ์๋ ์ํ์์ ์์ ์ด ๋ฐ์ํฉ๋๋ค. ๋ฐฉ๋ฌธ ๋ฐฉ๋ฒ์ด actor ๋ด์ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ๊ฒฐ๊ตญ data race condition์ด ๋ ์ ์์ต๋๋ค.
value ์ ํ๊ณผ actor๋ ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ์ง๋ง class๋ ์ฌ์ ํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Sendable์ ์ฌ์ฉํฉ๋๋ค.
Sendable type์ ๋ค๋ฅธ actor ๊ฐ์ ๊ฐ์ ๊ณต์ ํ ์ ์๋ type์
๋๋ค.
ํ ๊ณณ์์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๊ฐ์ ๋ณต์ฌํ๊ณ ๋ ์์น๊ฐ ์๋ก ๊ฐ์ญํ์ง ์๊ณ ํด๋น ๊ฐ์ ๋ณต์ฌ๋ณธ์ ์์ ํ๊ฒ ์์ ํ ์ ์๋ ๊ฒฝ์ฐ ์ ํ์ Sendable์ด ๋ ์ ์์ต๋๋ค.
1. value ํ์
์ ๊ฐ ๋ณต์ฌ๋ณธ์ด ๋
๋ฆฝ์ ์ด๋ฏ๋ก Sendable์
๋๋ค.
2. Actor ํ์ ์ญ์ mutable state์ ๋ํด ๋๊ธฐ์ ์ธ ์ ๊ทผ์ ๋ณด์ฅํ๋ฏ๋ก sendable์ ๋๋ค.
3. class๋ ์ฃผ์๊น๊ฒ ๋ค๋ค์ง๋ฉด sendable ํ์
์ด ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ง์ฝ class์ ๋ชจ๋ subclass๊ฐ immutable data๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด sendable์ด ๋ ์ ์์ต๋๋ค.
4. ๋๋ class๊ฐ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์ํํ๋ค๋ฉด ๋ฐ๋ผ์ concurrent์ ์์ ํ ์ ๊ทผ์ ๋ณด์ฅํ๋ค๋ฉด sendable์ด ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ํด๋์ค๋ ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์๋๋ฉฐ Sendable์ด ๋ ์ ์์ต๋๋ค.
5. ํจ์๋ ๋ฐ๋์ Sendable์ด ์๋๋ฏ๋ก ์กํฐ ๊ฐ์ ์์ ํ๊ฒ ์ ๋ฌํ ์ ์๋ ํจ์์ ๋ํ ์๋ก์ด ์ข
๋ฅ์ ํจ์ ์ ํ์ด ์์ต๋๋ค. ์ด๋ ๋ค์ ์ดํด๋ณด๋๋ก ํ์ฃ
actor๋ ์ฃผ๋ก Sendable type ์ธก๋ฉด์์ ํต์ ํด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด sendable ํ์
์ data race๋ฅผ ๋ง๊ธฐ ๋๋ฌธ์ด์ฃ .
์ด๊ฒ์ Swift๊ฐ ๊ฒฐ๊ตญ ์ ์ ์ผ๋ก ๊ฒ์ฌ๋ฅผ ์์ํ ์์ฑ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ non sendable ํ์
์ ๋ํด์ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค.
Sendable protocol์ ์ฑํํ๋ฉด swift๊ฐ ์๋์ผ๋ก sendable ์กฐ๊ฑด์ ๋ถํฉํ๋์ ์ฒดํฌ ํ ๊ฒ์ ๋๋ค.
Author์ ํด๋์ค ํ์ ์ผ๋ก sendable ํ์ ์ด ์๋๋๋ค ๋ฐ๋ผ์ ์ปดํ์ผ ์๋ฌ๋ฅผ ์ผ์ผํค์ฃ .
์ ๋ค๋ฆญ ํ์ ์ ๋ํด์ ์ธ์์ ๋ฐ๋ผ ๋ฌ๋ ค ์์ต๋๋ค.
์๊น ๋งํ๋ ํจ์๊ฐ sendable์ด ๋ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด๋ด
์๋ค.
ํจ์ ์์ฒด๋ Sendable์ด ๋ ์ ์์ต๋๋ค. ์ฆ, ์กํฐ ๊ฐ์ ํจ์ ๊ฐ์ ์ ๋ฌํ๋ ๊ฒ์ด ์์ ํ๋ค๋ฉด ๋ง์ด์ฃ . ์ด๋ ํด๋ก์ ๊ฐ data race condition์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ ์์
์ ์ ํํ๋ ํด๋ก์ ์ ํนํ ์ค์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด sendable closure๋ mutable ์ง์ญ ๋ณ์๋ฅผ captureํ์ง ๋ชปํฉ๋๋ค. sendable์ด ๋๋ค๋ฉด ์ด๋ฌํ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค.
๋๊ธฐ์ Sendable ํด๋ก์ ๋ actor๋ฅผ isolatedํ ์ ์์ต๋๋ค. ๊ทธ๋์ผ ์ธ๋ถ์์ actor์์ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฌ์ค Task.detached์๋ sendable ํ์ ์ ๊ฐ์ง๋๋ค..! (์ ์ด์ ์๋ ค์ฃผ๋๊ฑฐ๋ !!)
detached๊ฐ sendable์์ ๋ณด์ฅํ๋ ํด๋ก์ ์ด๊ธฐ ๋๋ฌธ์ counter struct์ mutable ํจ์์ธ increment๋ฅผ ํธ์ถ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋๋ค.
์๊น ๋ณด์๋ ๋ ๋ค๋ฅธ ์์์ ๋๋ค. detached๊ฐ sendable์ด๋ฏ๋ก actor์ isolated ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก detached์์ ์์ ์ ๋น๋๊ธฐ์ฌ์ผ ํฉ๋๋ค.
Sendable type๊ณผ ํด๋ก์ ๋ actor๊ฐ isolation ๋๋๋ฐ ๋์์ ์ค๋๋ค.
๋ง์ง๋ง์ผ๋ก ํน๋ณํ actor์ธ main actor์ ๋ํด ์ด์ผ๊ธฐ ํด๋ด
์๋ค !
Main thread์์ ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ฝ๋์ ๊ตฌ์กฐ๋ ๋ชจํธํ๊ฒ ์น์ํด ๋ณด์ ๋๋ค. ์ฌ์ค, ๋ฉ์ธ ์ค๋ ๋์ ์ํธ์์ฉํ๋ ๊ฒ์ ์กํฐ์ ์ํธ์์ฉํ๋ ๊ฒ๊ณผ ๋งค์ฐ ๋น์ทํฉ๋๋ค. ์ด๋ฏธ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ ์ค์์ ์๊ณ ์๋ค๋ฉด UI ์ํ์ ์์ ํ๊ฒ ์ก์ธ์คํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋ฉ์ธ ์ค๋ ๋์์ ์คํํ์ง ์๋ ๊ฒฝ์ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ํธ ์์ฉํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ actor๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ฉ์ธ ์กํฐ๋ผ๊ณ ๋ถ๋ฅด๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ค๋ช ํ๋ ํน๋ณํ ์กํฐ๊ฐ ์์ต๋๋ค.๋ฉ์ธ ์กํฐ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ํ๋ด๋ ์กํฐ์ ๋๋ค. ๋ ๊ฐ์ง ์ค์ํ ์ ์์ ์ผ๋ฐ ๋ฐฐ์ฐ์ ๋ค๋ฆ ๋๋ค. ๋จผ์ ์ฃผ ์กํฐ๋ ์ฃผ ๋์คํจ์น ๋๊ธฐ์ด์ ํตํด ๋ชจ๋ ๋๊ธฐํ๋ฅผ ์ํํฉ๋๋ค. ์ฆ, ๋ฐํ์ ๊ด์ ์์ ์ฃผ ์กํฐ๋ DispatchQueue.main์ ์ฌ์ฉํ์ฌ ๊ต์ฒดํ ์ ์์ต๋๋ค.
๋์งธ, ๋ฉ์ธ ์ฐ๋ ๋์ ์์ด์ผ ํ ์ฝ๋์ ๋ฐ์ดํฐ๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ ธ ์์ต๋๋ค. SwiftUI, AppKit, UIKit ๋ฐ ๊ธฐํ ์์คํ ํ๋ ์์ํฌ์ ์์ต๋๋ค. ์์ฒด view, viewController ๋ฐ data model์ UI ๋ถ๋ถ์ ๊ฑธ์ณ ์์ต๋๋ค. Swift ๋์์ฑ์ ์ฌ์ฉํ๋ฉด ์ ์ธ์ ์ฃผ ์กํฐ ์์ฑ์ผ๋ก ํ์ํ์ฌ ์ฃผ ์กํฐ์์ ์คํ๋์ด์ผ ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
์ด ์ธ์
์์ ์ฐ๋ฆฌ๋ actor isolation๋ฅผ ์ฌ์ฉํ๊ณ serialํ๊ฒ ์๋ํ๊ธฐ ์ํด actor ๋ฐ์์ ๋น๋๊ธฐ ์ก์ธ์ค๋ฅผ ์๊ตฌํจ์ผ๋ก์จ actor๊ฐ ๋์ ์ก์ธ์ค๋ก๋ถํฐ mutable state๋ฅผ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.
actor๋ฅผ ์ฌ์ฉํ์ฌ Swift ์ฝ๋์์ ์์ ํ๊ณ ๋์์ ์ธ ์ถ์ํ๋ฅผ ๊ตฌ์ถํ์ญ์์ค.
Value type๊ณผ actor๋ ํจ๊ป ์๋ํ์ฌ data race condition์ ์ ๊ฑฐํฉ๋๋ค. ์์ฒด ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ํด๋์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ณต์ ์ํ๋ฅผ ๋ค์ ๋์
ํ๋ ๊ธฐํ ๋น์ ์ก ์ ํ์ ์ฃผ์ํ์ญ์์ค. ๋ง์ง๋ง์ผ๋ก UI์ ์ํธ ์์ฉํ๋ ์ฝ๋์ ์ฃผ ์กํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ ์ค๋ ๋์ ์์ด์ผ ํ๋ ์ฝ๋๊ฐ ํญ์ ์ฃผ ์ค๋ ๋์์ ์คํ๋๋๋ก ํฉ๋๋ค. ์์ฒด ์ ํ๋ฆฌ์ผ์ด์
๋ด์์ ์กํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด Swift ๋์์ฑ์ ์ํ ์ฑ ์
๋ฐ์ดํธ ์ธ์
์ ํ์ธํ์ธ์. ๊ทธ๋ฆฌ๊ณ ์กํฐ๋ฅผ ํฌํจํ Swift์ ๋์์ฑ ๋ชจ๋ธ ๊ตฌํ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด “๋นํ์ธ๋ ์คํ ๋ฆฌ” ์ธ์
์ ํ์ธํ์ธ์. ์กํฐ๋ Swift ๋์์ฑ ๋ชจ๋ธ์ ํต์ฌ ๋ถ๋ถ์
๋๋ค. ๋น๋๊ธฐ/๋๊ธฐ ๋ฐ ๊ตฌ์กฐํ๋ ๋์์ฑ๊ณผ ํจ๊ป ์๋ํ์ฌ ์ ํํ๊ณ ํจ์จ์ ์ธ ๋์ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์.. ์ค๋ช ์ด ์ ๋ง ๊ธธ์์ต๋๋ค.
swift-evolution/Actors <- evolution ๊ธ๋ค๋ ํ๋ฒ ์ดํด๋ณด๊ณ ๋ค์ ๋ณต์ต์ด ํ์ํ ๋ฏ ํฉ๋๋ค .. ํ์ดํ ..!
'IOS๐ > WWDC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[WWDC 2021] Make blazing fast lists and collection views (0) | 2022.05.27 |
---|---|
[WWDC 2021] Your guide to keyboard layout (0) | 2022.05.26 |
[WWDC 2021] Meet async/await in Swift (0) | 2022.05.17 |
[WWDC 2020] Advances in diffable data sources (0) | 2022.05.12 |
[WWDC 2019] Advances in UI Data Sources (0) | 2022.05.10 |
๋๊ธ