데이터 다리

[프로젝트: 0.1%의 로직] 1일차 – C# 메인 프레임에 파이썬 두뇌 이식하기: 프로세스 간 통신(IPC) 기초

[프로젝트: 0.1%의 로직] 1일차 – C# 메인 프레임에 파이썬 두뇌 이식하기: 프로세스 간 통신(IPC) 기초

안녕하세요.

프롤로그에서 말씀드린 대로, 우리의 HTS는 **C#(UI 및 주문 제어)**과 **Python(데이터 분석 및 AI)**의 하이브리드 구조로 갑니다. 오늘 1일차의 목표는 이 두 개의 완전히 다른 언어가 서로 데이터를 주고받을 수 있는 가장 빠르고 직관적인 파이프라인을 구축하는 것입니다.

1. 기술적 배경: 어떻게 두 언어를 연결할 것인가?

서로 다른 환경에서 구동되는 프로그램을 연결하는 방법은 여러 가지가 있습니다. 소켓(Socket) 통신, REST API 구축, gRPC 등이 있지만, 단일 PC에서 구동되는 개인용 HTS의 특성상 가장 가볍고 직관적인 CLI(Command Line Interface) 기반의 표준 입출력 재지정 방식을 사용하겠습니다.

  • 전문 용어: IPC (Interprocess Communication, 프로세스 간 통신) – 운영체제 상에서 완전히 독립된 메모리 공간을 가지고 실행되는 두 개의 프로그램이 데이터를 교환할 수 있도록 운영체제가 제공하는 매커니즘입니다.
  • 전문 용어: Standard Output Redirection (표준 출력 재지정) – 파이썬 프로그램이 콘솔 화면에 출력(print)하는 문자열 데이터를 화면에 띄우지 않고, 호출자인 C# 프로그램이 백그라운드에서 메모리 스트림으로 직접 읽어 들이는 기법입니다.

2. 파이썬 두뇌 만들기 (brain.py)

먼저 C#의 호출을 받아 연산을 수행할 파이썬 스크립트를 작성합니다. 현재는 AI 모델이 없으므로, 단순히 입력받은 거래량 데이터를 판별해 문자열을 반환하는 기본 로직만 구현합니다.

Python

# 파일명: brain.py
import sys

def analyze_volume(data):
    try:
        volume = int(data)
        if volume > 100000:
            return f"RESULT: [경고] 거래량 급증 감지 ({volume})"
        else:
            return f"RESULT: 정상 거래량 ({volume})"
    except ValueError:
        return "ERROR: 잘못된 데이터 형식"

if __name__ == "__main__":
    # C# 프로그램에서 전달한 인자(Argument)를 수신합니다.
    if len(sys.argv) > 1:
        input_data = sys.argv[1]
        result = analyze_volume(input_data)
        # 이 print 함수의 출력 결과가 C#으로 바로 전달됩니다.
        print(result) 
    else:
        print("ERROR: 입력 데이터가 없습니다.")

3. C# 메인 프레임에서 파이썬 호출하기

이제 익숙한 Visual Studio에서 C# Windows Forms 또는 WPF 프로젝트를 열고, 파이썬 프로세스를 백그라운드로 실행하여 그 결과를 텍스트박스에 띄우는 로직을 작성합니다.

C#

using System.Diagnostics;
using System.IO;

// 버튼 클릭 이벤트 핸들러
private void btnAnalyze_Click(object sender, EventArgs e)
{
    string pythonExecutablePath = "python"; // 파이썬 실행 파일 경로
    string pythonScriptPath = "brain.py";   // 작성한 파이썬 스크립트 경로
    string testVolumeData = "150000";       // 파이썬으로 넘길 테스트 데이터

    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = pythonExecutablePath;
    startInfo.Arguments = $"{pythonScriptPath} {testVolumeData}";
    
    // 핵심 설정 사항
    startInfo.UseShellExecute = false; // OS 쉘을 사용하지 않고 직접 실행 (리다이렉션을 위해 필수)
    startInfo.RedirectStandardOutput = true; // 파이썬의 표준 출력을 가로챔
    startInfo.CreateNoWindow = true; // 검은색 콘솔(CMD) 창을 화면에 띄우지 않음

    using (Process process = Process.Start(startInfo))
    {
        using (StreamReader reader = process.StandardOutput)
        {
            // 파이썬 프로세스가 종료될 때까지 대기하며 결과를 읽어옴
            string result = reader.ReadToEnd(); 
            
            // 화면의 TextBox 컨트롤에 결과 출력
            txtLog.Text += result + Environment.NewLine;
        }
    }
}

4. 20년 차의 냉정한 현실 점검 (주의 사항)

위 코드는 완벽하게 동작하지만, 실전 매매 프로그램에 그대로 적용하면 큰일 납니다. 현재 코드는 **동기식(Synchronous)**으로 작성되어 있습니다.

파이썬 쪽에서 복잡한 딥러닝 모델을 돌리느라 응답이 5초 지연된다면, 그 5초 동안 C#의 HTS 화면은 하얗게 굳어버리는 ‘프리징(Freezing)’ 현상을 겪게 됩니다. 0.1초 단위로 호가가 변하는 시장에서 UI 프리징은 곧바로 금전적 손실(계좌 녹음)로 직결됩니다.

  • 전문 용어: Asynchronous Task (비동기 처리) – 메인 UI를 그리는 스레드(Thread)를 멈추지 않고, 백그라운드의 별도 작업 공간에서 파이썬 호출 및 대기를 수행하게 하는 프로그래밍 기법입니다. C#의 async / await 키워드를 사용하여 추후 반드시 개선해야 할 부분입니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다