-
[Swift] Actor (๋น๋๊ธฐ ํ๊ฒฝ์์ Data Race ๋ฅผ ํผํด๋ณด์) - #1Swift 2023. 5. 6. 03:10
๐ค What and Why..
ํ์ฌ์์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ฉด์ ํ์ด์ง ํจ์นญ๊ณผ ๋ก๋ฉ ์คํผ๋๋ฅผ async/await ๋ฅผ ํ์ฉํด์ ๊ตฌํํ์ต๋๋ค.
๋น ๋ฅด๊ฒ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ค๋ณด๋ ๋น ๋ฅด๊ฒ ํ์ด์ง๊ฐ ๋์ด๊ฐ๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก ํจ์น๊ฐ ๋ถ๋ฆฌ๊ฒ ๋์๊ณ ๊ทธ์์ค์ ๊ฐ์ข ๋ณ์์ ๊ฐ์ด
์ ์ ์์๊ณผ๋ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด์ ๊ณต๋ถ์ ํ์์ฑ์ ๋๋ผ๊ฒ ๋์์ต๋๋ค.
์ฒ์์๋ NSLock, Semaphore ๋ฑ์ ๊ณต๋ถํด๋ณด๋ ค ํ์ง๋ง Swift ์ ์ต์ ๋ฌธ๋ฒ๋ฑ๊ณผ ์ ์ด์ธ์ด์ง๋งํ Actor ์ ๊ณต๋ถํ๊ฒ ๋์์ต๋๋ค.
๐ด๐ป Actor?
actor ๋ class, enum, struct ๊ณผ ๊ฐ์ด ํ์ ์ค ํ๋์ด๋ฉฐ ์ฐธ์กฐ ํ์ ์ผ๋ก์จ ์ฐจ์ด๋ผ๋ฉด ๋๊ธฐ์ ์ผ๋ก ์ํ์ ์ ๊ทผํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ ๋ฌด์จ ์๋ฏธ์ธ์ง๋ ์๋ ์ฝ๋์์ ๋ด ์๋ค.
๐ป Code
์๋๋ฅผ ๋ณด์๋ฉด ๋ญ๊ฐ ๊ธฐ๋๊ฐ์ด ์ด์ํ๋ค๋ ๊ฒ์ ์์ค์ ์์ต๋๋ค.
์์๋๋ก 1...20์ด ์ฐํ์ง ์๊ณ ์์๊ฐ ์ด์ํฉ๋๋ค. ์์ผ๊น์?
๋ฐ๋ก Task ๋ก ๊ฐ์ธ์ ธ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ์ด ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง ์กฐ๊ธ๋ ์๊ฐํด๋ณด๋ฉด ์ด์ฐจํผ increase ๋ 20๋ฒ ์คํ๋์์ํ ๋ฐ
์ ์์๋๋ก ํ๋ฆฐํธ๊ฐ ์ฐํ์ง ์์ ๊ฑธ๊น?
๊ทธ๊ฒ์ ๋ฐ๋ก class ์์ ๋ด๋ถ๋ฅผ ์ฐธ์กฐํ ๋ ์์์ ๋ฐ๋ผ ์คํ๋๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
import Foundation class Counter { var count = 0 func increase(times: Int) { for _ in 1...times { Task { count += 1 print(count) } } } } let counter = Counter() counter.increase(times: 20) // ์ถ๋ ฅ 1 2 4 โ 5 6 7 8 9 3 โ 10 11 12 13 14 15 16 17 18 19 20
์๋๋ actor ๋ก ์ ์ธ๋ counter ์ ๋๋ค.
20๋ฒ์ ์คํํ๋๋ฐ ์์๋๋ก ์ฐํ์ฃ ?
์๋ํ๋ฉด ์์๋๋ก ์ฐธ์กฐ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
import Foundation actor Counter { var count = 0 func increase(times: Int) { for _ in 1...times { Task { count += 1 print(count) } } } } Task { let counter = Counter() await counter.increase(times: 20) } // ์ถ๋ ฅ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
์ฐธ๊ณ ๐๐
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL - ๋น๋๊ธฐ์๋ ๋น์ฉ์ด ์กด์ฌํ๋ค (2) 2023.05.06 [Swift] Actor #2 - @MainActor (class ์ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ) (0) 2023.05.06 [Swift] Protocol ์ ์ฒ์ ๋ถํฐ ๊ณต๋ถํด๋ณด์ (0) 2023.05.02 [Swift] ๋๋ฒ๊ทธ ํ ๋ ์ ์ฉํ ๊ธฐ๋ฅ๋ค (0) 2023.04.28 [Swift] URL๋ก ๋ค๋ฅธ ์ฑ ์ด๊ธฐ (0) 2023.04.25