크레온 플러스 API 연동관련 IsConnect 확인 후 강제종료

크레온 플러스 API 연동시 특정 시스템에서 발생하는 문제가 있다.

결론부터 이야기하자면, 윈도우즈 운영체제에서 인식하는 CPU 개수가 1개인 경우에 CpCybos의 IsConnect 값을 확인하는 경우에 실행중인 어플리케이션이 강제 종료되는 현상이 있다. CPU 개수가 2개 이상인 경우에는 문제없이 작동하는 것을 확인했다.

원인을 파악하는 상세한 과정은 아래에 적어두었다. 과정에 대해 궁금하지 않은 사람은 읽지 않아도 괜찮다.

테스트한 머신은
Vultr 가상 머신 1 CPU, 2G RAM
python 3.9.6
pywin32 302

필자가 작성한 파이썬 코드에서 IsConnect에서 문제가 생기는 것을 확인하고, 문제를 파악하기 위해서 다시 작성한 코드는 아래와 같다.

import win32com.client
import time

print("START")
cp_cybos = win32com.client.Dispatch('CpUtil.CpCybos')
print("LOADED")
a = time.time()
is_connected = cp_cybos.IsConnect
b = time.time()
d = b - a
print("%.8f" % d)

for i in range(10):
print(i)
time.sleep(1)

print("END")

화면 출력 결과는 오류 없이 아래와 같이 출력되고 끝난다.

START
LOADED
5.55898523
0
1

너무 당황스러웠다, For Loop을 돌다가 어플리케이션이 강제종료된다는 것은 상식적인 코드의 실행결과가 아니었다.

흥미로운 것은 IsConnect 값을 얻어오는 과정이 문제가 생기지 않는 머신에서는 1초 미만의 시간만 걸리는 한 편, 문제가 생기는 머신에서는 5초 이상의 시간이 걸린다는 것이었다.

집에 있는 PC에서도 동일한 python 버전과 동일한 버전의 pywin32 라이브러리를 사용했는데, 결과가 달랐다.

1차적으로는 OS 버전이 달랐기 때문에, 혹시나 하는 마음으로 집에 있는 운영체제와 같은 버전의 윈도우를 Vultr의 동일 사양의 인스턴스에 설치해보았다. 하지만 결과는 같았다. 동일한 문제가 생기고 있었다. OS 버전의 차이가 영향을 주는 게 아니라는 것을 확인했다.

크레온 플러스 API Q&A 게시판에서 관련 게시물들을 검색하다가, “Re : 비주얼 스튜디오 닫힘 현상”이라는 게시물을 확인했고, 디버깅 하는 경우에는 “메모리 보안 프로그램 사용”을 끄고 사용해야 한다는 것이다.

그래서 동일한 시스템에서 “메모리 보안 프로그램 사용”의 체크를 해제하고 크레온 플러스를 실행하니, 정상 작동이 되는 것이다. 그러면 보안 프로그램 끄고 쓰면 되겠네 싶겠지만, 집에 있는 피씨에서는 보안 프로그램을 끄지 않고도 잘 된다. 보안 프로그램을 쓸 수 있는 PC와 쓸 수 없는 PC에는 어떤 차이가 있어서 그런 것일까 의문이 들었다.

가상 머신이라서 안 되는 것일까 싶은 생각이 들어서, 현재 개발용 머신으로 사용하는 Ubuntu 20.04에 Gnome Boxes 위에 동일한 윈도우즈를 설치하고 테스트해봤다. 전혀 문제가 생기지 않았다.

그렇다면 Vultr 서비스에 어떤 문제가 있어서 그런 것 아닐까 싶었다. 그런데 지난 번에 사용했던 $20 짜리 인스턴스는 문제가 생기지 않았었는데, 왜일까 싶은 생각이 들었다. 현재 테스트한 Vultr의 인스턴스는 CPU 1개짜리, 잘 되던 인스턴스는 CPU 2개짜리 였다. 잽싸게 떠놓은 Snapshot으로 CPU 2개짜리 인스턴스를 띄우고 테스트 해 봤고, 잘 작동하는 것을 확인했다.

이게 정말 원인이라면 Gnome Boxes에서도 동일한 문제가 생겨야 한다는 생각으로 Gnome Boxes의 CPU 개수를 1개로 변경하고 다시 테스트 해봤는데, 동일한 문제가 생겼다.

결론을 다시 정리해 보았다.

첫째, AOS는 CPU 개수가 1개인 머신에서 크레온 플러스의 IsConnect 값을 얻어오는 과정에서 문제를 일으킨다.

둘째, 가상머신이나 클라우드 서비스와는 아무 상관이 없다.

해결책
IsConnect 값을 얻어온 이후에 얼마 안 있다가 어떠한 오류 메시지도 없이 작성한 어플리케이션이 종료된다면, CPU 개수를 운영체제가 몇 개로 인식하고 있는지 확인하고, 만약 1개라면 2개 이상인 머신에서 구동한다.

끝!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다