프로젝트/COHO - 코인 호재 캘린더

[Django] 코호 - 실시간 코인 호재 캘린더 PROC 11

모영이 2021. 4. 2. 23:19

결국에는 다시 원점으로 돌아왔다. 배포는 이번주 주말까지는 무조건 완료하기로 했다. 과연 이번주 주말까지 끝낼 수 있을지도 의문이다. 솔직히 시간은 많지만, 점점 의욕이 떨어지는 기분이다. 끝이 다다를수록 심해지는데 어쩔 수 없다. 번아웃을 극복해야 한다.

 

해결한 문제

멀티 프로세스와 멀티 스레드를 사용해도 속도가 더 줄어들지 않아 전부 멀티 프로세스로 바꿨다. 요약하자면 Rollback을 시켰다. ORM의 구조를 바꿨다. JSON형태로 바로 넘겨주기로 했다. model.py의 class내용을 바꿨다. 

마주친 문제

ORM데이터의 구조를 바꿨는데, sql파일을 migrate를 다시 해주어야 했다. 찾아보니깐 attribute를 바꿨을 때 python mange.py syncdb이걸 사용하라고 되어있는데 없다고 나와서 직접 삭제하고 sql파일을 다시 만들었다. 이렇게 하는지는 모르겠는데 어쨌든 해결을 했다. 

해결 해야 할 문제

사실 제일 큰 문제가 하나 남았다. 주기적으로 parser.py를 실행 시켜주어야 하는 문제다. 우선 계획으로는 이걸 해결하고 배포를 해야하지만, 배포를 하고 나서 이걸 해결하려고 한다. 시간을 벌어야 한다. 

 

model.py

from django.db import models


class BlogData(models.Model):
    title = models.CharField(max_length=200)
    content = models.JSONField(default=dict)

    def __str__(self):
       return self.title

parser.py

import concurrent
import json
import collections
import multiprocessing
import time
from concurrent.futures.thread import ThreadPoolExecutor

import crawl_coinmarketcal as coinmarketcal
import crawl_coinscalendar as coinscalendar
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "websaver.settings")
import django
django.setup()
from parsed_data.models import BlogData
global result
def preprocessingDict(dic: dict):
    coin_dict = collections.defaultdict(dict)
    for key, value in dic.items():
        if value['symbol'] in coin_dict[value['date']]:
            coin_dict[value['date']][value['symbol']].append([key, value['title'], value['name']])
        else:
            coin_dict[value['date']][value['symbol']] = [[key, value['title'], value['name']]]
    return coin_dict

if __name__ == '__main__':
    start_time = time.time()
    manager = multiprocessing.Manager()
    result = manager.dict()
    procs = []
    urls = []

    urls = coinmarketcal.get_urls()
    for url in urls:
        proc = multiprocessing.Process(target=coinmarketcal.do_crawl, args=(url, result,))
        procs.append(proc)
        proc.start()

    urls = coinscalendar.get_urls()
    for url in urls:
        proc = multiprocessing.Process(target=coinscalendar.do_crawl, args=(url, result,))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

    print(time.time() - start_time)
    BlogData(title="COIN_DATA", content=json.dumps(preprocessingDict(result.copy()))).save()