반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- UiPath
- Selenium 셀렉터잡기
- 네이버커머스API
- 네이버 로그인 캡챠해결
- Element is not clickable at point
- Uipath 설치방법
- uipath 입문
- 커머스API
- 네이버매물크롤링
- 파이썬 환경설정
- 파이썬 가상환경 설치방법
- 파이썬네이버부동산
- 파이썬 가상환경 설치
- 가상환경설치
- pycdc.exe
- Python
- 날짜 정규식
- pycdas.exe
- selenium
- pywinauto 윈도우
- 네이버부동산크롤링
- 네이버 로그인 하기
- pywinauto 윈도우제어
- 네이버 로그인 영수증 해결
- 왕초보 파이썬 실행
- vscode venv 설치
- venv 설치
- 파이썬 네이버 로그인
- pywinauto
- Uipath 기초
Archives
- Today
- Total
콘솔워크
비동기 처리 본문
반응형
비동기처리??
작업을 동기적으로 처리한다면 이전 작업이 끝날때까지 다음 작업을 하지 않는다. (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("토큰 가져오기 실패")
위의 변화를 줘서 다른 환경에서도 잘 작동하게 되었다.
반응형
'프로그래밍 > python' 카테고리의 다른 글
for문에서 각각 변수명을 선언하는 방법 (0) | 2023.01.16 |
---|---|
개인적으로 권장하는 엑셀 파일 dataframe화 방식 (0) | 2023.01.13 |
string이 특정 html 태그 안에 있는지 확인해보는 정규식 (0) | 2023.01.12 |
json 파일 다루기 (0) | 2023.01.11 |
메모장에서 글 한 줄씩 읽어오기 (0) | 2023.01.10 |