I3396 83afcc84f84f44ed811e268863d53eb3
안녕하세요. ENCE입니다. 오늘은 스크립트에서 멀티쓰레딩 작업을 하여 서버 프리즈를 막아보겠습니다.
서버 속도 저하 및, 서버 폭팔 방지 구문 활용법
강좌를 시작하기 전, 아직 모르시는 분들을 위해 일부 용어를 설명하고 시작하겠습니다.
프로세스: 컴퓨터 내에서 실행되는 프로그램 ( 여기서는 버킷을 칭함 )
스레드(thread): 프로세스 내에서 작업을 처리하는 공간
메인스레드(주 스레드): 프로세스의 기본적인 처리공간
스크립트를 자주 사용하시고, 많이 다뤄보시는 분들은 아시는 스크립트의 단점.
스크립트는 플러그인에 비해 속도가 느리다는 것입니다.
수학적 계산에서는 최대 46~3만 7천배정도 속도가 플러그인에 비해 느리고
다른 연산에서도 플러그인에 비해 상대적으로 속도가 떨어집니다.
[ 링크참조 ]
https://m.blog.naver.com/kites_/221555668124
메인 스레드에서 스크립트가 필요 이상으로 차지하게 될 경우, 다른 플러그인이나 패킷 작업 등등 서버에서 처리하는 작업들이 지연되고, 지연이 계속되면 서버에 크래시가 생겨 서버가 닫히는 등 서버에 문제가 발생하게 됩니다.
한번 테스트를 해볼까요?
크롤링 구문을 실행해보겠습니다.
Command /test:
trigger:
send "연산 시작" to console
set {_url} to text from url "https://www.naver.com"
send "연산 완료" to console
이렇게 1~2초간에 지연이 생기며, 지연시간동안의 작업은 처리 후에 작업되여
이를 통해 서버가 2초동안 정지됨을 알 수 있습니다.
스크립트가 중단되거나 긴 작업을 수행하더라도 프로그램의 수행,
즉 스크립트가 연산을 수행해도 서버 자체에는 무리가 가지 않아야 서버가 터지지 않겠지요?
이를 해결하기 위해 스레딩 관련 구문인 $ thread
라는 구문이 있습니다.
해당 기능에 대한 설명입니다.
Makes the next line run on a different thread.
The code below the next line will be delayed until the thread finishes.
Please note that Bukkit stuff aren't thread safe.
번역하면 다음 줄을 다른 스레드에서 실행하도록 한다. 라고 하네요.
즉 주 스레드에 영향을 끼치지 않는다는 말이 됩니다.
해당 기능을 사용하기 위해서는 SKquery
애드온이 필요합니다.
다운로드 하지 못하신 분들은 아래 링크에 접속하여 다운로드 해주시기 바랍니다.
https://www.spigotmc.org/resources/skquery-1-9-1-16.36631/
Command /test:
trigger:
send "연산 시작" to console
$ thread
set {_url} to text from url "https://www.naver.com"
send "연산 완료" to console
이렇게 한번 실행해보겠습니다.
이렇게 연산동안 지연이 발생하지 않음을 알 수 있습니다.
메인 스레드만 활용한다는건 마치 전기 회로에서 모든 가전을 직렬로 연결하여 과부하가 발생하는것과 똑같은 일입니다.
당연히 멀티스레딩을 해야 최적화는 더 잘 되기 마련입니다.
대신 이 기능을 사용할 경우 일부 구문이 작동하지 않을 수 있습니다.
엔티티의 메타데이터나 블럭 데이타 등같은 작업은 이뤄지지 않습니다.
일반 기능에 사용하는건 오히려 불필요한 스레드 증가로 서버 속도가 느려짐으로 사용하지 않으셔야 합니다.
이 구문을 작성할 경우 아래애 있는 구문이 메인쓰레드에서 처리되지 않습니다.
스크립트로 주 시스템을 만드시는경우에는 멀티스레딩을 참조해주시면 되겠습니다.
( 네 지금까지 제 설명 듣느라 고생하셨습니다. 너무 못쓴듯해서 죄송합니다 )
긴글 읽어주셔서 감사합니다.
댓글이 없습니다.
새로운 댓글을 등록해 주세요!