아주 간단합니다. 다만,  googletrans의  최신 버전은 내부적으로 비동기 함수를 사용하기 때문에, translator.translate() 호출 시 await를 사용하지 않으면 coroutine 객체가 반환됩니다. 그러므로, await 문법을 사용하지 않는 googletrans의 구버전(4.0.0-rc1)을 설치하여 번역 프로그램을 만들수도 있습니다.

 

1단계: async와 await 사용 

비동기 방식을 사용하기 위해, asyncio 라이브러리를 사용하여 코드를 비동기적으로 실행해야 합니다.

 
import googletrans
import asyncio # asyncio 라이브러리 추가

async def main():
    """
    비동기 방식으로 번역을 실행하는 메인 함수
    """
    translator = googletrans.Translator()

    str_1 = "오늘은 가을비가 내리는 아침입니다."
    # translate 함수가 비동기 함수이므로, await를 사용해 결과를 기다립니다.
    result_1 = await translator.translate(str_1, dest="en", src="auto")
    print(f"오늘은 가을비가 내리는 아침입니다. -> {result_1.text}")

    str_2 = "I am so happy."
    # 마찬가지로 await를 사용합니다.
    result_2 = await translator.translate(str_2, dest="ko", src="auto")
    print(f"I am so happy => {result_2.text}")

if __name__ == "__main__":
    # asyncio.run()을 사용하여 비동기 함수인 main()을 실행합니다.
    asyncio.run(main())
 

 

  • import asyncio: Python의 비동기 프로그래밍을 위한 핵심 라이브러리입니다.
  • async def main():: async 키워드는 이 함수가 비동기 함수임을 명시합니다.
  • await translator.translate(): await 키워드는 translate() 함수가 작업을 완료할 때까지 기다리라고 지시합니다. 이 과정에서 다른 작업을 동시에 처리할 수 있어 효율적입니다.
  • asyncio.run(main()): asyncio.run() 함수는 비동기 프로그램을 시작하는 진입점 역할을 합니다. 이 함수를 통해 main() 함수가 실행되고, await로 표시된 모든 비동기 작업이 완료될 때까지 기다립니다.

 

2단계: 영문 문서를 번역해서, 한글 문서에 저장하기

 
import googletrans
import asyncio
from os import linesep

async def main():
    translator = googletrans.Translator()

    read_file_path = "원문(영문).txt"
    write_file_path = "원문번역(한글).txt"

    with open(read_file_path, "r") as f:
        read_lines = f.readlines()

    for lines in read_lines:
        result = await translator.translate(lines, dest="ko", src="en")
        print(result.text)

        with open(write_file_path, "a", encoding="utf-8") as f:
            f.write(result.text + "\n")

if __name__ == "__main__":
    asyncio.run(main())
 

[ 참조 ] coroutine 

coroutine은 파이썬에서 비동기(asynchronous) 프로그래밍을 가능하게 하는 특별한 함수입니다. 일반 함수와 달리, 실행 중에 잠시 멈췄다가 나중에 다시 이어서 실행될 수 있는 특징을 가지고 있습니다.

가. coroutine의 핵심 개념

일반 함수가 시작부터 끝까지 한 번에 실행되는 반면, coroutine은 await 키워드를 만나면 실행을 잠시 중단하고 제어권을 다른 coroutine에게 넘겨줍니다. 그리고 await 대상 작업(예: 네트워크 요청, 파일 읽기 등)이 완료되면 다시 실행을 재개합니다.

이러한 특성 덕분에 하나의 프로그램이 여러 작업을 동시에 처리하는 것처럼 보이게 만들 수 있습니다.

나. coroutine이 필요한 이유

예를 들어, 웹사이트 100개에서 정보를 가져오는 프로그램을 만든다고 가정해 봅시다.

  • 동기식(Synchronous):
    • 1번 웹사이트 요청 → 응답을 기다림 (10초 소요)
    • 2번 웹사이트 요청 → 응답을 기다림 (10초 소요)
    • ...
    • 총 1000초가 걸립니다.
  • 비동기식(Asynchronous) - Coroutine 활용:
    • 1번 웹사이트 요청 → await
    • 2번 웹사이트 요청 → await
    • 3번 웹사이트 요청 → await
    • ...
    • 100개의 요청을 동시에 보낸 뒤, 응답이 오는 대로 결과를 처리합니다. 가장 오래 걸리는 요청 시간만큼의 시간이 소요되어 전체 작업 시간이 획기적으로 줄어듭니다.

Coroutine은 이런 I/O 작업(Input/Output)이 많은 프로그램에서 빛을 발합니다. 컴퓨터가 데이터를 기다리는 동안 다른 작업을 처리하도록 만들어 효율성을 극대화합니다.

반응형

+ Recent posts