일상/IT

Java, Python, JavaScript 및 Go에서 비동기화 구현

얇은생각 2023. 8. 28. 07:30
반응형

효율적이고 응답성이 높은 애플리케이션을 만드는 데 있어서의 역할을 강조하면서 4개 언어로 비동기화에 대해 설명합니다.

주로 자바에서 수년간 일한 경험이 있는 소프트웨어 개발자로서 최근 새로운 프로젝트로 파이썬으로 전환했을 때 호기심을 느꼈습니다. 전환은 자바, 파이썬, 자바스크립트, 골랑 등 다양한 언어로 된 비동기 프로그래밍의 세계를 탐험하게 만들었습니다. 비동기 프로그래밍 기술과 예에 대한 통찰력을 제공하는 것을 목표로 이 언어에 대한 내 탐색과 개인적인 경험의 결과입니다.

 

 

Java, Python, JavaScript 및 Go에서 비동기화 구현

 

 

Java의 비동기 프로그래밍

자바에서 처음 프로그래밍을 시작했을 때 스레드 개념에 빠르게 익숙했습니다. 시간이 지나면서 Executor 프레임워크와 CompletableFuture 클래스가 비동기 작업을 처리하는 더 강력하고 유연한 방법을 제공한다는 것을 알게 되었습니다.

예를 들어, 나는 Executor 프레임워크를 사용하여 여러 웹 사이트에서 동시에 데이터를 가져오는 웹 스크래퍼를 구축했습니다. 고정 스레드 풀을 사용하여 리소스를 효율적으로 관리하면서 동시 연결 수를 제한할 수 있었습니다:

ExecutorService executor = Executors.newFixedThreadPool(10);
for (String url : urls) {
    executor.submit(() -> {
        // Fetch data from the URL and process it
    });
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

 

 

Python의 비동기 프로그래밍

파이썬으로 전환하면서 처음에는 비동기 프로그래밍에 대한 다른 접근 방식에 도전했습니다. 그러나 비동기 라이브러리와 비동기/대기 구문에 대해 배운 후 강력하고 우아한 솔루션이라는 것을 알게 되었습니다.

여러 번의 API 호출이 필요한 파이썬 기반 마이크로 서비스를 구현한 적이 있습니다. 비동기 및 비동기/대기를 활용하여 이러한 호출을 동시에 실행하고 전체 응답 시간을 크게 줄일 수 있었습니다:

import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    urls = [...]  # List of URLs
    tasks = [fetch(url) for url in urls]
    responses = await asyncio.gather(*tasks)

asyncio.run(main())

 

 

자바스크립트의 비동기 프로그래밍

자바스크립트로 작업할 때, 저는 비동기 프로그래밍에 대한 선천적인 지원을 높이 평가했습니다. 그 결과, 저는 다양한 웹 애플리케이션에서 콜백, 약속 및 비동기/대기를 광범위하게 사용했습니다.

예를 들어, 나는 여러 RESTful API의 데이터를 필요로 하는 Node.js 애플리케이션을 구축한 적이 있습니다. 약속과 비동기/대기를 사용하여 코드를 단순화하고 오류를 보다 우아하게 처리할 수 있었습니다:

const axios = require("axios");

async function fetchData(urls) {
    const promises = urls.map(url => axios.get(url));
    const results = await Promise.all(promises);
    // Process the results
}

const urls = [...]  // List of URLs
fetchData(urls);

 

 

Golang의 비동기 프로그래밍

골랑을 탐험하는 동안, 저는 고루틴과 채널 덕분에 동시성과 비동기 프로그래밍에 대한 고유한 지원에 매료되었습니다.

예를 들어, 여러 소스의 데이터를 실시간으로 처리해야 하는 프로젝트를 수행하는 동안 리소스를 효과적으로 관리하고 데이터 흐름을 동기화하기 위해 고루틴과 채널을 활용했습니다:

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func processSource(url string, ch chan<- string) {
    resp, err := http.Get(url)
    if err != nil {
        ch <- fmt.Sprintf("Error fetching data from %s: %v", url, err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    // Process the fetched data
    ch <- fmt.Sprintf("Processed data from %s", url)
}

func main() {
    sources := [...]  // List of data sources
    ch := make(chan string, len(sources))

    for _, url := range sources {
        go processSource(url, ch)
    }

    for range sources {
        fmt.Println(<-ch)
    }
}

 

 

결론

비동기 프로그래밍은 현대 애플리케이션 개발의 중요한 측면이며, 다양한 언어에 걸쳐 구현되는 것을 깊이 이해하는 것은 매우 중요합니다. 자바, 파이썬, 자바스크립트, 골랑에 대한 내 경험은 각 언어가 비동기 작업을 관리하기 위한 고유하고 강력한 기능을 가지고 있다는 것을 가르쳐 주었습니다.

이러한 경험과 사례를 공유함으로써 다른 사람들이 자신의 프로젝트에 비동기성을 수용하여 궁극적으로 보다 효율적이고 반응이 좋은 애플리케이션을 만들도록 장려하고자 합니다.

반응형