실용적인 Kotlin 본체 병렬

새로운 개발자에게 Kotlin Native(이하 "KN")에 대한 더욱 곤혹스러운 일은 상태와 병발 모델이다.일반적으로 Kotlin 개발자는 JVM에서 왔으며 모든 것이 같기를 바랍니다.사실은 그렇지 않다.
그러나 비록 다르지만 이 모델은 개념적으로 매우 간단하다.연습을 통해 당신의 머리를 맑게 하는 것은 그리 어렵지 않다.

This post series is part of the KMP Starter Kit available here: https://go.touchlab.co/kampdevto


왜?


Java, C++, Swift/Objc 등 언어는 여러 개의 스레드가 제한을 받지 않는 방식으로 같은 상태에 접근할 수 있도록 합니다.이것은 너, 개발자, 나쁜 짓을 피하는 데 달려 있다.병발 문제는 다른 프로그래밍 문제와 다르다. 왜냐하면 그들은 통상적으로 재현하기 어렵기 때문이다.너는 현지에서 그것들을 보지 못하지만, 생산 중, 적재할 때, 그것들이 나타날 것이다.
테스트가 통과되었다고 해서 코드가 되는 것은 아니다.
모든 언어가 이렇게 설계된 것은 아니다.개발자들이 가장 잘 아는 것은 자바스크립트다.Worker를 사용하여 어느 정도의 병발성을 실현할 수 있지만, 같은 상태를 인용하고 수정할 수는 없습니다.언어 Rust는 성능과 보안을 위해 구축되었습니다.병렬 관리는 이 언어에 설계되었기 때문에 본질적으로 C++에서 무제한 공유 상태의 고유한 위험을 줄이는 것과 유사하다1.
KN에는 스레드 간에 상태를 공유하는 방법에 대한 규칙이 있습니다.이러한 규칙은 KN에는 적용되지만 Kotlin JVM(이하 KJ)에는 적용되지 않습니다.그러나 Kotlin 멀티플랫폼의 관건적인 목표는 Kotlin의 각종 버전이 원본 코드 호환성을 유지하는 것이다.언어 자체를 바꾸어 강제 병발(예를 들어 Rust)하는 것은 어떤 면에서는 매력적이지만 JS와 JVM에 대한 지원을 파괴할 수 있다.따라서 KN의 새 규칙은 실행될 때 구현되고 실행됩니다.

두 가지 규칙


새로운 규칙은 개념적으로 매우 간단하다.

1) 가변 상태 = 1 스레드


상태가 변경될 수 있다면, 한 번에 하나의 라인만 볼 수 있습니다.나중에 이것이 무엇을 의미하는지 설명하지만, 모든 상태가'가변적'이라고 가정하면, KN의 느낌은 Kotlin에서 작성한 다른 내용과 거의 같을 것입니다. 최상위 속성을 사용하거나 동반하지 않는 한 object자세한 내용은 섹션 2 "전역 상태"를 참조하십시오.
규칙 1의 목표는 매우 간단하다.만약 하나의 라인만 있다면, 병발 문제는 없다.기술적으로 말하자면, 이것을'선로 제한'이라고 부른다.로컬 이동과 데스크톱 사용자 인터페이스 개발자에게는 익숙할 것이다.백그라운드 스레드에서 UI를 변경할 수 없습니다.KN은 이 개념을 요약했다.

2) 불변 상태 = = 다중 스레드


상태를 변경할 수 없으면 스레드 간에 공유할 수 있습니다.이것은 개념적으로도 매우 간단하다.

그렇습니다.두 가지 규칙.


이것은 어떻게 실현되었는지, 그 의미는 분명히 더욱 복잡하지만, KN과 병발 배후의 기본 개념은 매우 간단하다.

지위


KN 상태와 병렬 규칙에 대한 빠른 사이드바일 뿐입니다.지난 몇 년 동안 지역사회는 KJ에서 이행하기 쉽도록 이러한 규칙을 늦추는 압력을 받아 왔다.이것은 시간의 추이에 따라 계속될 수 있지만 파괴적인 방식은 아니다.2020년에는 이 규칙들이 좀 완화될 수 있지만 현재 작성된 코드는 작동할 수 있다는 뜻이다.이런 규칙을 지키는 압력은 입사 체험을 개선하는 데 불과하다.너는 내가 그 진영에 있다고 말할 수 있다. 그래서 이 문장은.어쨌든

비밀번호


우선, 견본을 얻는다.샘플을 사용하려면 Intellij Community (or Ultimate) 2019.3 이상의 버전이 필요합니다.
복제 샘플 재구매:

터치 실험실 / KNConcurrencySamples 회사



클론이 생성되면 Intellij에서 샘플 항목을 엽니다.

1) 단순 상태


우선, 우리는 몇 가지 기본 상태에서 시작할 것이다.기본 변수, 변이값.별로 재미없어요.네가 어떤 합병도 하지 않을 때, 단지 일이 어떻게 일을 하는지 보여줄 뿐이다.
Intellij에서 샘플 항목을 엽니다.찾기SampleMacos.kt.주 함수에 주석이 있는 코드가 있습니다.찾기1) Simple State 및 메모 취소runSimpleState().
IDE의 오른쪽에서 Gradle 을 찾은 다음 창에서 runDebugExecutableMacos 을 두 번 클릭합니다.

이것은 매우 기본적인 예이다.그것은 단일 노드의 상태가 평소와 같이 변할 수 있다는 것을 증명했다.
fun runSimpleState(){
    val s = SimpleState()
    s.increment()
    s.increment()
    s.report()
    s.decrement()
    s.report()
}

class SimpleState{
    var count = 0

    fun increment(){
        count++
    }

    fun decrement(){
        count--
    }

    fun report(){
        println("My count $count")
    }
}
인쇄:
My count 2
My count 1
계속...

2) 동결 상태


동결되지 않는 한 모든 상태는 가변적입니다.동결 상태는 다른 언어에 존재하지만 Kotlin의 새로운 개념이다.KN에서는 모든 클래스에 하나의 함수freeze()를 정의합니다.당신이 freeze() 를 호출할 때, 이 대상과 접촉한 모든 것은 고정불변한 것이다.
일단 동결되면 상태는 라인 사이에서 공유할 수 있지만 변경할 수 없습니다.SampleMacos.kt에서 "2) 동결 상태"를 찾습니다.설명 freezeSomeState() 을 취소하고 실행하십시오. (지금부터 다시 실행하는 것을 말합니다runDebugExecutableMacos.
fun freezeSomeState(){
    val sd = SomeData("Hello 🐶", 22)
    sd.freeze()

    println("Am I frozen? ${sd.isFrozen}")
}

data class SomeData(val s:String, val i:Int)
너는 마땅히 보아야 한다
Am I frozen? true
실행 중 상태가 변경되고 있는지 확인하십시오.KNN의 각 객체에는 동결 여부를 나타내는 플래그가 있습니다. sd 에서는 방금 true로 뒤집었습니다.SampleMacos.kt로 돌아가서 다른 주석하지 않은 방법을 주석하고 주석을 취소합니다failChanges().다시 실행합니다.
이것은 실패할 것이다. 그러나 예외가 하나 있다.Intellij의 출력 콘솔은 탐색하기 어려울 수 있습니다.전체 출력을 보려면 맨 위를 클릭하십시오.

코드는 다음과 같습니다.
fun failChanges(){
    val smd = SomeMutableData(3)
    smd.i++
    println("smd: $smd")

    smd.freeze()
    smd.i++
    println("smd: $smd") //We won't actually get here
}

data class SomeMutableData(var i:Int)
출력은 다음과 같습니다.
smd: SomeMutableData(i=4)
Uncaught Kotlin exception: kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen sample.SomeMutableData@8b40c4b8
        at 0   KNConcurrencySamples.kexe  (yada yada)
        at 1   KNConcurrencySamples.kexe  (yada yada)
(etc)
중점객체를 동결하기 전에 var 값을 변경할 수 있습니다.동결된 후에 값을 변경하려고 하면 이상이 발생합니다.InvalidMutabilityException, 정확히 말하면.InvalidMutabilityException당신의 새 친구입니다.처음에는 이런 느낌을 받지 못했을 수도 있지만, 사실은 그렇다.InvalidMutabilityException를 보았을 때, 이것은 이미 동결된 상태를 바꾸려고 시도하고 있다는 것을 의미한다.이 상태를 동결하기를 원하지 않을 수도 있습니다. 따라서 동결의 원인을 찾아내는 작업이 될 것입니다.기억해라, 네가 어떤 물건을 동결할 때, 그것이 접촉하는 모든 것은 동결된다.우리는 잠시 후에 이 문제를 상세하게 토론할 것이다.경험에 의하면 처음에는 좀 곤혹스러울 수밖에 없다.금방 안 할 거야.시스템과 디버깅에 사용할 수 있는 도구만 알면 됩니다.

중지


첫 번째 부분은 여기까지입니다.우리는 이미 IDE를 설치하고 몇 가지 기본적인 예시 함수를 실행했다.우리는 아직 어떤 병렬 코드도 작성하지 않았다.첫 번째 단계는 기초 지식을 간단하게 이해하는 것이다.
이 게시물은 KN의 동시 기능을 설명하기 위한 것입니다.우리는 많은 내용을 건너뛰고 당신이 매일 사용할 수 있는 내용만 소개할 것입니다.만약 당신이 더 깊이 잠수하고 싶다면, Stranger Threads과 나의 것을 보십시오.
그래, 녹도 다른 것일 거야. 하지만 이런 상황에서... 

좋은 웹페이지 즐겨찾기