개인 자료란 (JE)

  서버 커뮤니티

Profile 분열 대표칭호 없음
Profile

강좌 자바 에디션(JE) 플러그인 개발

[ 심화 ] 스크립트로 비동기 처리 (쓰레드)를 써보자

2020.03.22 조회 수 1660 추천 수 5
분야 스크립트 
게임버전 모든버전 

들어가기에 앞서 이해하고 가면 좋은 개념:

동기 : 작업을 그 즉시 처리하게 하며, 해당 작업을 수행하는 도중 다른작업의 처리는 불가능함 (지연됨)

비동기 : 작업을 수행하게 되면 처리가 조금 늦어지는 대신 다른작업을 동시에 수행할 수 있음


스크립트의 가장 큰 단점 중 하나로 여겨지는 것이 비동기 처리의 불가능입니다. 

예를 들어, 1000만번을 루프한 다음 , send구문을 통해 "완료!" 라는 메시지를 띄우게 하는 구문이 있다고 가정해 봅시다.

loop 10000000 times:
     set {_temp} to 1
     #대충 렉 걸리게 하는 구문
send "완료!" to player

해당 구문을 작성한 다음 실행하게 되면 약 몇초간 서버 자체가 멈추게 됩니다.

이는, 스크립트가 구문을 처리할때 마인크래프트의 메인쓰레드에서 처리를 하기 때문에, 스크립트가 메인쓰레드를 차지하게 되며, 다른 작업의 처리가 지연되기 때문입니다 (동기)


이를 해결하기 위한 방법중 하나가 '비동기 처리 (쓰레드 생성)' 입니다.

쓰레드는 하나의 처리 공간으로, 비동기 처리를 위해서 메인쓰레드 (직접적인 상호작용 이루어 지는곳)와 별개로 추가적인 쓰레드를 생성해 그곳에서 작업을 하는 방식입니다.

그런데 버킷은 싱글쓰레드로 악명이 높죠..?

그래서 비동기처리를 할때는 엔티티와의 상호작용, 블럭과의 상호작용등과 같이 직접적으로 접근을 하게 되면 비동기 관련 작업 오류를 뱉어내며 작동을 하지 않습니다. (단점)

(질문해본 결과 비동기 작업에서 처리할 만큼 다 해놓고, 메인쓰레드에서 실제 작업을 해야한다네요)


서론이 길었으니 우선 스크립트에서 사용될 구문을 보여드리겠습니다.

#Skquery
$ thread #다음줄에 나오는 구문을 쓰레드를 생성하여 처리합니다.(설명은 이렇지만 해당 구문 밑으로 쭉 적용)
ex)
command /test:
     trigger:
            $ thread
            tempfunc()
#Mundosk
async:
    #해당 블록내에 있는 구문을 비동기로 처리합니다.
ex)
command /async:
     trigger:
           async:
                 loop 10000000 times:
                       set {_temp} to 1

이렇게 구문을 작성하시게 되면 해당 구문은 비동기로 처리가 되게 되며, 메인쓰레드에 부담을 주지 않게 됩니다

#해당 작업 수행도중 채팅이 딜레이 없이 쳐짐


직접 테스트한 구문

function loop():
     #고의로 렉 걸리게 하는 구문
     loop 10000000 times:
          set {_temp} to 1
command /trg:
     trigger:
          loop()
          send "종료됨!" to player

해당 구문 사용시 3초간의 채팅지연 발생 (tps 20.0기준)


function loop():
     loop 10000000 times:
          set {_temp} to 1
command /async:
     trigger:
            $ thread #async 블럭 쓰셔도 됩니다
            loop()
            send "종료됨!" to player

해당 구문 사용시 채팅지연없이 작동됨 (tps 20.0 기준)


+ 스크립트에서 비동기 작업시 메모리 누수 방지 차원에서 비동기 작업 이전에 선언된 임시변수를 모두 날려버립니다.. 

코드로 설명하는게 더 빠를거 같아요

command /다른명령어:
     trigger:
            set {_다른임시변수} to 3
            #비동기작업이 시작되도 영향 X
command /비동기명령어:
     trigger:
            set {_임시변수} to 5
            $ thread (async:)
            loop()
            send "%{_임시변수}%" to player #none으로 출력됨 (삭제됨)


쓰기는 각자나름! (플러그인도 좋아요!)

다음 강좌 : packet? ㄷㄷ





2개의 댓글

YeeV
2020.04.03

앞으로 루프를 많이 사용하는 작업을 할 때는 비동기처리를 사용해야 겠네요..

옛날에 자바스크립트 배울때 비동기 때문에 많이 애먹었는데 오랜만에 보니 추억이 떠오르네요

MK5
2020.04.20

'$ thread'로 메인 쓰레드 부담을 덜고

'async'로 비동기 처리군요. 꿀팁들 메모합니다!

뉴스 및 창작물
/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ?

팀뉴일리시

2024-11-23

4

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 5

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 4

물귀신

2024-10-06

3

/files/thumbnails/839/895/003/262x150.crop.jpg?20241006021227

SRV레코드는 보안도메인이 아닙니다. [서버오픈시 필독]

물귀신

2024-10-05

4