아무리 파이썬이라고는 하지만 디스코드봇의 코드는 여러가지로 생소한 부분이 많습니다. 물론 여러 사이트에서 코드를 복붙해가면서 익히는 것도 방법이지만, API 문서를 보려면 꼭 이해해야 하는 것이 코드 자체의 처리방식인 비동기 처리와 함수들의 구조인 객체지향입니다. 시작해봅시다.
1. 전체적인 작동원리 파악하기
import discord
client = discord.Client()
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('hello!')
client.run('your token here')
지난시간에 PyCharm에 복붙한 샘플봇입니다.
봇의 응답은 사용자(클라이언트)가 채팅을 했을 때만 이루어집니다. 채팅을 치기 전까지는 대기하다가, 채팅을 치면 봇이 취해야 할 동작을 프로그램에 의해 결정하게 됩니다. 이렇게 대기하다가 이벤트가 발생하면 코드를 실행하는 방식은 파이썬이 항상 처리하던 순차구조와는 다릅니다. 기존처럼 파이썬 코드를 작성한다면 반복문 안에 if문을 넣고 1초마다 새 메시지를 확인하는 방식을 써야 할 것입니다.
코드를 처리하는 시간이 1초라 가정하고, 1초 내에 5곳에서 요청이 들어온다고 칩시다. 원래의 파이썬 문법대로면 코드를 처리하는 동안은 요청을 처리할 수 없습니다. 처음 들어온 1곳만 처리가 된 다음, 요청을 받을 수 있는 상태가 되는 것이죠. 그러면 안되겠죠? 그래서 함수 앞에 async를 붙여 비동기 함수라고 표시합니다.
2. 비동기 함수란?
원래는 멀티코어를 통해 처리해야 합니다. 예를 들어 3개의 요청이 1초 내로 들어왔다 치면,
1번 코어에서는 요청을 처리할 코어를 정합니다. 첫 번째는 4번 코어에 보내고, 2 번째는 3번 코어에 보내서, 4번 코어의 연산이 끝난 후 들어온 요청은 다시 4번 코어에 보냅니다. 이를 쓰레딩(threading)이라 합니다. 더 나아가서, 1번코어는 항상 요청을 받을 수 있으므로 연산이 밀려도 들어온 요청을 언제 연산할지 계획하고 명령을 내릴 수 있죠. 이때 1번 코어의 역할을 스케줄러(scheduler)라 합니다.
오류 없는 스케줄러를 짜는 것은 여간 어렵습니다. 싱글코어에서는 사용하지 못한다는 단점도 있지요. 그래서 비동기 함수가 등장합니다. 싱글코어에서 두 가지 일을 동시에 처리하는겁니다. 쉽게 말해, 1번과 4번코어를 하나의 하나의 코어에서 동작할 수 있도록 한다는 것이죠!
3. 비동기 함수의 코드
import asyncio
def sync_a():
print('동기 함수')
async def sync_b():
print('비동기 함수')
#실행방법 1. 다른 비동기 함수 내에서 호출
async def sync_main():
await sync_b()
#실행방법 2. 코드 내에서 호출하는법
#파이썬 버전 3.6 이하의 경우
loop = asyncio.get_event_loop()
loop.run_until_complete(sync_main())
loop.close
#파이썬 버전 3.7 이상의 경우
asyncio.run(sync_main())
비동기함수는 일반적인 함수(동기 함수)처럼 실행시킬 수 없습니다. 그들만의 리그가 있는 느낌이죠..
위 코드처럼 loop라는 인스턴스를 만들어서 비동기함수를 순차처리 하게 만들어야 합니다.
파이썬 3.7 이상에서는 한 줄로 구동이 가능합니다.
설명하지 않은게 하나 남죠. '@client.event' 문법입니다. 다음시간에 설명할게요.
근데 loop라는 인스턴스? 무슨말이죠? 객체지향입니다. 다다음 시간에 설명할겁니다.
태그된 시리즈 바로가기 ↓↓
https://ghlabnote.tistory.com/tag/디스코드봇
https://ghlabnote.tistory.com/tag/파이썬%20문법
'프로젝트 > 설명' 카테고리의 다른 글
디스코드봇 5. 코드의 원리 파악하기 (2) 데코레이터 (0) | 2020.12.20 |
---|---|
CSS 핵심 내용 정리 (0) | 2020.12.17 |
디스코드봇 3. 파이썬 가상환경 구축, 라이브러리 추가, 실행 (0) | 2020.11.28 |
디스코드봇 2. 시작을 위한 환경설정 (0) | 2020.11.28 |
디스코드봇 1. 개요 (0) | 2020.11.28 |