콘솔워크

비동기 처리 본문

프로그래밍/python

비동기 처리

이휘재123 2023. 1. 12. 17:57
반응형

비동기처리??

작업을 동기적으로 처리한다면 이전 작업이 끝날때까지 다음 작업을 하지 않는다. (Synchronous)

하지만 비동기적으로 처리한다면 흐름이 끊기지 않고 여러 작업의 처리가 가능하다. (Asynchronous)

 

 

기존에 네이버 커머스 API를 사용하기 위해 토큰에 접근하는 코드가 하나 있었다.

    def initData(self):
        self.set_client_secret_sign()
        self.set_token()
        
  	   
    def set_client_secret_sign(self):

        self.timestamp = round(time.time() * 1000)

        # 밑줄로 연결하여 password 생성
        password = self.client_id + "_" + str(self.timestamp)

        # bcrypt 해싱
        hashed = bcrypt.hashpw(password.encode("utf-8"), self.client_secret.encode("utf-8"))

        # base64 인코딩 -> param으로 사용될 것
        self.client_secret_sign = pybase64.standard_b64encode(hashed).decode("utf-8")


    
    def set_token(self):
        auth_url = "https://api.commerce.naver.com/external/v1/oauth2/token"
        params = {
            "client_id": self.client_id,  # 제공된 클라이언트 ID
            "timestamp": self.timestamp,  # 전자서명 생성 시 사용된 밀리초(millisecond) 단위의 Unix 시간. 5분간 유효
            "client_secret_sign": self.client_secret_sign,  # 전자서명
            "grant_type": "client_credentials",  # OAuth2 인증 방식 -> client_credentials 고정
            "type": "SELF",
            "account_id": self.account_id,  # type이 SELLER인 경우 입력해야 하는 판매자 ID
        }

        res = requests.post(auth_url, params=params)
        if res.status_code == HTTPStatus.OK:
            data = json.loads(str(res.text))
            self.token = data["access_token"]
        else:
            global_log_append("토큰 가져오기 실패")
            print("토큰 가져오기 실패")

 

근데 해당 코드로 작성하고나니 내 컴퓨터에서는 토큰을 잘 획득했는데,

다른 성능이 좋은 컴퓨터에서 실행하니 획득을 하지 못했다!!

 

CPU 연산 시간 보다 API와의 연동 시간이 더욱 길어서 발생한 문제였다.

 

단순히 time.sleep(1)로 대기시간을 추가하면 되는 상황이었지만 비동기 프로그래밍으로 처리하도록 하였다.

 

import asyncio


	def initData(self):
        asyncio.run(self.set_client_secret_sign())
        asyncio.run(self.set_token())
        # self.set_client_secret_sign()
        # self.set_token()

    async def set_client_secret_sign(self):

        self.timestamp = round(time.time() * 1000)

        # 밑줄로 연결하여 password 생성
        password = self.client_id + "_" + str(self.timestamp)

        # bcrypt 해싱
        hashed = bcrypt.hashpw(password.encode("utf-8"), self.client_secret.encode("utf-8"))

        # base64 인코딩 -> param으로 사용될 것
        self.client_secret_sign = pybase64.standard_b64encode(hashed).decode("utf-8")

        await asyncio.sleep(1)

    async def set_token(self):
        auth_url = "https://api.commerce.naver.com/external/v1/oauth2/token"
        params = {
            "client_id": self.client_id,  # 제공된 클라이언트 ID
            "timestamp": self.timestamp,  # 전자서명 생성 시 사용된 밀리초(millisecond) 단위의 Unix 시간. 5분간 유효
            "client_secret_sign": self.client_secret_sign,  # 전자서명
            "grant_type": "client_credentials",  # OAuth2 인증 방식 -> client_credentials 고정
            "type": "SELF",
            "account_id": self.account_id,  # type이 SELLER인 경우 입력해야 하는 판매자 ID
        }

        res = requests.post(auth_url, params=params)
        if res.status_code == HTTPStatus.OK:
            data = json.loads(str(res.text))
            self.token = data["access_token"]
            await asyncio.sleep(1)
        else:
            global_log_append("토큰 가져오기 실패")
            print("토큰 가져오기 실패")

 

위의 변화를 줘서 다른 환경에서도 잘 작동하게 되었다.

반응형