뭐든지 async 모드예요.

6852 단어 architectureidea
첫 번째 느슨한 실장 모드(수준: 초보자 탈출)의 글(계속할 수 없을 수도 있음).

컨텐트

  • 모든 뇌사 async 모드
  • 함정이 존재한다. 즉, 언어의 실행 라인 모델 등에 주의하지 않는 것이다
  • 창고 모드를 활용하라
  • 뇌사 async 모드는 쓰기는 좋지만 그렇게 간단하지는 않다
  • 뇌사 async 모드는


    청결한 구조의 UseCase 같은 것을 위에서 아래로 쓸 수 있다고 상상해 주셨으면 좋겠습니다.
  • 필요한 데이터 확보
  • 어떤 처리를 하는가
  • 결과가 조건에 부합되면 어느 위치에 저장
  • 이렇게 대략적인 처리 절차를 진행할 때 각자의 처리가 아직 정해지지 않았기 때문에 잠시 다른 단계로 삼아 다음과 같은 느낌의 코드를 쓸 수 있다.
    async function f1() {
        let inputData = await inputFromAnywhere()
        let outputData = await someProcessing(inputData)
        if (await outputData.hasCondition()) {
            outputToSomewhere(outputData)
        }
    }
    
    이런 코드의 장점은
  • 때로는 호출 등보다 쓰기가 쉽고 전체 구조를 보기 쉽다
  • 각 처리 시간 등 상세한 상황을 몰라도 쓸 수 있다
  • async/await 문법으로 호출측(UI 등)을 차단하지 않는 비동기 처리로 쓸 수 있음
  • 등등, 그래서 어느 정도 장점이 있다.
    또한 단식 빨간색 모형의 언어(예를 들어 자바스크립트), 처리를 본식육으로 되돌려주지 않으면 다른 처리가 정지된 유형의 라이브러리(예를 들어 PyQt) 등으로 되돌려주지 않는 경우 동기화 처리에서 시간이 걸린 처리를 호출하면 다른 처리가 정지됩니다.이런 구조를 도입해야 하는 경우도 있다.

    비동기 처리 중의 스텔스 전제 조건


    뇌사 async 모드는 비동기 처리이기 때문에 몇 가지 전제 조건이 있다.이것을 고려하지 않으면 발견하기 어려운 문제를 일으킬 수 있다.

    재입적 문제


    이 함수 f1 자체는 async 함수이기 때문에 f1을 여러 번 호출할 때 동시에 병행 조작할 수 있습니다.예를 들어 UI 이벤트 (단추를 눌렀을 때) 에서 f1을 호출하면 f1의 처리가 이중으로 실행되는 것을 고려해야 한다.

    병렬 동작 문제


    함수 자체를 다시 입력하거나 다른 함수와 동시에 실행하려면 병행 조작을 고려해야 한다.
    예를 들어 일반적인 병렬 처리 문제로서 우리는 몇 가지 조건을 추가하고 다음과 같은 함수를 만들었다.
    async function f2() {
        if (await existsInputData()) {
            let inputData = await inputFromAnywhere()
    
            ...
        }
    }
    
    existsInputData를 통해 입력 데이터가 존재하는지 확인하고 inputFrom Anywhere를 통해 입력을 읽는 처리를 상상하십시오.
    existsInputData와 inputFrom Anywhere 사이에 다른 처리를 수행할 수 있기 때문에 이 함수를 동시에 실행하면 existsInputData는 진짜로 답장하지만 inputFrom Anywhere가 실행되기 전에 상태가 바뀌어 입력을 받아들일 수 없으며 예상 밖의 상태가 될 수 있습니다.

    병렬 실행 문제


    단일 빨간색 모형의 언어에 대해 말하자면 어떤 처리 프로세스에서 await를 사용하지 않으면 중간에 다른 처리를 하지 않지만 다중 스레드 모형의 언어에서 await를 사용하든 안 하든 각 상세한 처리에 대해서도 병행 작업을 고려해야 한다.
    await 호출 처리를 사용할 때, 보통 일부 라인에서 실행된 다음 처리를 기다립니다.다만 스레드 생성을 명확하게 하지 않고 내부와 다중 스레드 프로그래밍은 같은 구조이기 때문에 스레드 안전 처리를 통해 모든 것을 구성해야 한다.
    또한 단식 빨간색 모형의 언어라면 await 동기화 실행을 포기하고exists Input Data와 input From Anywhere 사이에 다른 처리가 실행되지 않기 때문에 f3와 같은 수정은 의미가 있을 수 있지만 다중 루틴 모형이 병행 실행된다면 이 수정은 문제를 해결할 수 없습니다.
    async function f3() {
        if (existsInputData()) {
            let inputData = inputFromAnywhere()
    
            ...
        }
    }
    

    기본 대책


    잠금 보호


    ASync 자체가 의심되는 다선정 구조로 볼 수 있기 때문에 대책도 다선정의 배타적 처리와 같다.재진입을 방지하기 위해 집행할 때 반드시 잠금이나 신호로 전체 집행을 보호해야 하며, 병행 집행 문제를 방지하기 위해서는 각 구성 요소의 처리를 라인 안전으로 실현해야 한다.

    알고리즘 보호


    또한 병행 집행의 문제를 일으키지 않기 위해 각 구성 요소뿐만 아니라 전체적인 처리 절차에도 여러 처리를 동시에 집행할 수 있는 구조가 필요하다.
    알고리즘을 말하자면 좀 과장된다. 예를 들면
  • 국부화 부작용, 다중 처리 간의 의존성 제거
  • 확정과 획득의 병행 집행을 단독으로 실행하는 것을 금지한다
  • 이런 기본적인 일들은 매우 중요하다.즉, 자신이 좋아하는 방식으로 임의로 낙서하는 것이 아니라, 문제의 인코딩을 병행하여 실행하는 것을 피할 수 있는 사람만이 뇌사async모드를 활용할 수 있다는 것이다.

    창고 가져오기 모드


    극단적으로 여러 처리에서 의존 관계가 없으면 병행 실행 문제는 상관없기 때문에 국부적 의존성을 위해 창고 모드를 가져올 수 있다.
    창고 모델의 정의는 사람에 따라 다르다
  • 데이터의 입력과 출력을 한 종류로 모아 일치성을 유지한다
  • 이것은 느슨한 정의다.
    예를 들어 UserData 클래스를 처리하는 창고로서 UserDataManager와 유사한 클래스를 준비하여 UserData 대상의 입력과 출력이 모두 UserDataManager를 통과하도록 규정한다.
    UserDataManager에서는 일관성을 유지할 수 없는 인터페이스를 정의하지 않는 것이 중요합니다.즉, UserDataManager에 get과 set의 인터페이스를 준비하면 get과 set이 언제든지 실행될 수 있습니다.이를 위해 내부는 자물쇠 등으로 배타 처리를 하거나 대기열을 호출해 직렬화하는 등의 조치를 취한다.
    중요한 것은 매니저를 창고로 생각하면 상세한 내용을 안에 제한해 외부인들이 자유롭게 호칭할 수 있도록 하는 것이다.
    또한exists와 같은 인터페이스도 준비할 수 없는 것은 아니지만 문제를 일으키기 쉬우므로 처음부터 준비하지 않는 전략도 유용하다.안전한 부품만 준비해서 그것을 조립하는 것은 전체적으로 안전하게 하는 수법이라고 볼 수 있다.

    총결산


    여기까지 하겠습니다.
  • 뇌사 async 모드는 상세한 상황을 고려하지 않고 전체 프로세스를 쓰기 시작하는 데 도움이 된다
  • 창고 모드와 결합하여 꼼꼼하게 설치하여 비교적 안전하다
  • 알겠습니다.
    즉, 결론은 다음과 같다.
    결과적으로 세부적인 것을 고려하지 않고 전체를 적절히 쓰려 해도 모순을 일으킬 수 있으므로 주의가 필요하다
    네.쉽게 생각하지 말고 착실하게 걸어라.

    좋은 웹페이지 즐겨찾기