UTC/KST, ISO 8601, Scheduling, APScheduler, 부호화(Encoding), 복호화(=역부호화, Decoding), Pickle/피클링
오늘은 배운 내용과 실습해본 내용을 병기하겠다.
시간
에 대해서 배웠다. 갑자기 왜 시간에 대해서 다루었을까? 아래와 같이 '시간'을 주의해야 하는 상황이 있기 때문이다. 서비스에서 시간을 이용하는 경우
에 대해서 주로 다루었다. 이 예시로 이전에 해봤던 github, tweepy API 문서를 보았는데, 보고 나니 그 필요성에 대해 이해하는데 도움이 되었다. 각각 아래와 같은 내용이 있다.UTC
, ISO 8601
이다. UTC±0
# 기준UTC±[hh]:[mm]:[ss]
UTC±[hh]:[mm]
UTC±[hh]
UTC+9
로 할 수 있겠지.$ date -u
치면 UTC 시간 볼 수 있다. $ date
쳐보면 KST 기준 현재 시간을 확인할 수 있다. 날짜와 시간과 관련된 데이터 교환을 다루는 국제 표준
이다.22-01-01
로 하고, 누구는 2022-01-01
로 하고, 누구는 2022-1-1
로 하는 등 차이가 나면 각각의 서비스를 개발하고 배포하는 엔지니어에게는 굉장한 혼란이 오게 된다. date +%s
와 Unix Time$ date +%s
를 치면 1655713934
이 나오는데, 이 시간은 Unix Time 혹은 Epoch Time 이라고 부른다.1655713934
는 이 유닉스 타임을 기준으로 1655713934초 지났다는 걸 말한다. 내가 무심코 써온 이 시간
이라는 것에도 참 많은 히스토리가 있다는 게 참 신기한 일인 것 같다.
스케쥴링은 내가 지정한 작업을 정해진 시간에 맞춰 진행되도록 하는 것이라고 생각하면 될 것 같다.
이전 회사에서 새벽으로 데이터 동기화 예약 걸어두는 거 많이 했었는데 딱 그거 생각하면 될 것 같다!! 예에~
APScheduler
는 파이썬 라이브러리로 어플리케이션 딴에서 스케쥴링을 조정하는 방식이다. 오늘은 이 라이브러리를 통해 스케쥴링 하는 것에 대해서 배웠다.
APScheduler
말고 훨~~씬 더 많이 쓰이는 Cron
이라는게 있는데, 이건 unix 기반으로 운영체제 딴에서 동작한다고 함. 그래서 많은 문제점도 발견되고 있다고 함. 필요시 더 찾아보기.APScheduler
는 파이썬 라이브러리이기 때문에 스케쥴러가 제대로 동작하기 위해서는 파이썬이 늘 켜져있어야 한다. 즉, 컴퓨터가 24시간 돌아가도록 해야할 수도 있단 말이다. 이럴 때 쓸 수 있는게 뭐다~? 지난 주에 배운 AWS EC2
를 이용하면 거기서 24시간 돌아가는 컴퓨터를 빌릴 수 있다~~$ pip install apscheduler
스케쥴러 선언하기 → 스케쥴러에 Job 선언하기 → 스케쥴러 시작하기
[Step1. 스케쥴러 선언하기]
APScheduler
에서는 다양한 스케쥴러를 선언해서 사용할 수 있다. 그 목적에 따라 쓸 수 있는 게 다양하게 있다. BlockingScheduler
BackgroundScheduler
AsyncIOSchedule
GeventScheduler
TornadoScheduler
TwistedScheduler
QtScheduler
BlockingScheduler
만 써봤다. from apscheduler.schedulers.blocking import BlockingScheduler
# UTC+0 기반으로 실행하려면 Timezone 에 매개변수를 선언 후 사용
scheduler = BlockingScheduler({'apscheduler.timezone':'UTC'})
# KST 기반으로 실행하는 방법
#scheduler = BlockingScheduler({'apscheduler.timezone':'Asia/seoul'})
[Step2. 스케쥴러 Job 선언하기]
from apscheduler.schedulers.blocking import BlockingScheduler
#스케쥴러 선언하기
scheduler = BlockingScheduler({'apscheduler.timezone':'UTC'})
#스케쥴러 job 선언하기
def hello():
print('Hola Mundo')
scheduler.add_job(func=hello, trigger='interval',seconds=5)
from apscheduler.schedulers.blocking import BlockingScheduler
#스케쥴러 선언하기
scheduler = BlockingScheduler({'apscheduler.timezone':'UTC'})
#스케쥴러 job 선언하기
def hello():
print('Hola Mundo')
scheduler.add_job(func=hello, trigger='interval',seconds=5)
[Step3. 스케쥴러 시작하기]
scheduler.start()
만 추가해주면 된다. 이제 파일을 실행해보면, 아래와 같이 5초마다 한번 씩 hello 함수에서 작성한 것이 출력되게 된다.
음.. 이번 프로젝트 때 어디까지 쓰게 될지는 모르겠지만 회사에 가면 주로 부하가 없는 시간 대를 많이 골라 작업하는 일이 많은텐데 그때 요긴하게 써먹을 수 있을 것 같다.
두다님, 저번에 머신러닝 모델 만든 거 저한테 전달 좀 해주세요.
인메모리 방식 -> 바이트열 방식
바이트열 방식 -> 인메모리 방식
Pickle
을 사용하면 된다!!!import pickle
my_list = ['a', 'b', 'c']
# Encoding
with open("data.pickle", "wb") as file: #참고로 data.pkl로 해도 된다고 함. 바이트형으로 넘기기 때문에 'wb'임!!
pickle.dump(my_list, file) #파일로 던지기 때문에 dump다. 인메모리면 dumps. 이건 json이랑 동일함.
# 이렇게 하면 data.pickle이라는 파일이 생겨서 다른 사람에게 그 파일을 전달해주면 된다.
# Decoding - data.pickle 파일 받은 사람이 푸는 것
with open('data.pickle', 'rb') as read_file: # 바이트형이기 때문에 'rb'임!!
data = pickle.read(read_file)
print(data) # => ['a', 'b', 'c']
model = LinearRegression()
처럼 이 model
을 넘겨주면 되는거야~ 대신 디코딩할 때 load()
함수를 사용함. import pickle
model = None
with open('model.pkl','rb') as pickle_file:
model = pickle.load(pickle_file)
X_test = [[4000]]
y_pred = model.predict(X_test)
print(f'{X_test[0][0]} sqft GrLivArea를 가지는 주택의 예상 가격은 ${int(y_pred)} 입니다.')
[Json 데이터 인코딩/디코딩하기]
# 인코딩
data = {
"first_value": {
"name": "odee",
"album": "ZIPLOC"
}
}
import json
# json으로 부호화한 뒤, 객체에 읽을 때
json_data = json.dumps(data)
# json으로 부호화한 뒤, 파일에 쓸 때
with open('json_file.json','w') as json_file:
json.dump(data,json_file)
# 디코딩
import json
str_1 = None
with open('json_file1.json','r') as json_file:
str_1 = json.load(json_file)
print(str_1)
wb
, rb
가 아니라 그냥 w
, r
인 것이다) str_1
의 타입은 딕셔너리다.웹에서 받은 Json 데이터를 받아 딕셔너리로 확인하거나, 딕셔너리 데이터를 Json으로 변환한 뒤 웹 API로 전달할 수 있는 것
으로 기억해두자! 마샬
, struct
, AVRO
등 다양한 방식이 존재한다고 한다. 지금까지 사용한 csv, json, pickle이 문제점이 많은 데이터 형식임에도 많이 쓰이는 건 편리하기 때문이라고 함. 나중에 다시 마주칠 일이 있겠지..?