JSPython에서 병렬 API 호출을 만드는 방법

여러 API 호출을 병렬로 수행해야 하는 경우는 매우 일반적인 시나리오입니다. 병렬 호출을 하면 대기 시간이 줄어들고 솔루션 성능이 향상됩니다. 데이터 로드 프로세스의 속도를 높이거나 일종의 로드/스트레스 테스트를 수행하려고 합니다.
Javascript에서는 여러 개Promises를 가동한 다음 함수Promise.all()를 사용하여 모두 성공할 때까지 기다릴 수 있습니다. 또는 RxJS, 스트림 또는 제어 콜백을 사용할 수 있습니다.

JSPython 은 모든 명령을 동시에 평가하도록 설계되었습니다. 주로 단순성 때문에 Python 사용자처럼 보입니다. 데이터 엔지니어와 분석가는 약속, 스트림 또는 콜백과 함께 제공되는 복잡성을 좋아하지 않습니다. JSPython은 핵심에서 모든 약속을 기다리거나 해결합니다. 따라서 JSPython 런타임의 어디에도 약속이 없습니다(일부 예외적인 경우 제외).

그렇다면 코드를 병렬로 실행하는 방법은 무엇입니까?
정답은 RxJs 입니다. RxJs 함수를 사용하여 관찰 가능한 시퀀스를 만든 다음 내보낸 응답 값을 결합하고(forkJoin 사용) Promise로 다시 변환할 수 있습니다(JSPython에서 자동으로 평가됨).

다음 JSPython 코드는 이 접근 방식을 보여줍니다. 이 예는 5개의 병렬 요청을 만들고 해당 requestId와 함께 응답 배열을 반환합니다.

from 'rxjs' import forkJoin, lastValueFrom, map

ids = [2, 7, 4, 9, 5]

httpRequests$ = ids
    .map(
        requestId => httpRequest$("GET", "https://jsonplaceholder.typicode.com/posts/" + requestId)
                                            .pipe(
                                                map(r => {requestId, response: r.data})
                                            )
    )

return lastValueFrom(forkJoin(httpRequests$))




코드를 살펴보겠습니다.
  • RxJs 함수 가져오기
  • ID 배열을 만듭니다.
  • map function을 사용하여 ID 배열을 Observable 배열로 변환합니다.
  • httpRequest$ 함수를 사용하여 서버에서 데이터를 가져옵니다. 비동기 내장 함수는 HTTP 요청을 보내고 응답을 받을 때 요청된 데이터를 내보내는 Observable을 반환합니다.
  • 그런 다음 Observablepipe(map(...))을 사용하고 requestId 및 응답
  • 을 추가하여 결과를 변환합니다.
  • 그런 다음 모든 관찰 가능 항목이 완료되고 배열에서 응답이 결합될 때까지 기다립니다. 이쪽
  • forkJoin 을 사용한다
  • 그런 다음 함수lastValueFrom를 사용하여 observable을 Promise로 변환합니다. 그런 다음 JSPython은 기본적으로 Promise를 동기 결과로 확인합니다
  • .

    운영


    Run를 누르면 결과가 표시됩니다.



    작업 예



    작동 예제는 여기에서 찾을 수 있습니다.
    https://run.worksheet.systems/data-studio/app/guest/jspy-playground?file=http-calls%2Fparallel-http-requests.jspy
    또는 크롬 확장 프로그램을 사용하는 경우
    chrome-extension://dkhnlgcpdiifkfjdjceogenclkdfbonh/index.html#/data-studio/app/guest/jspy-playground?file=http-calls%2Fparallel-http-requests.jspy

    순차 대 병렬 API 호출



    또 다른 예에서는 run_Sequential 중 하나가 https 요청을 순차적으로 만들고 run_Parallel 함수가 동일한 작업을 병렬로 수행하는 두 가지 다른 함수를 보여주고 싶습니다.

    from 'rxjs' import forkJoin, lastValueFrom, map
    
    ids = [2, 7, 4, 9, 5]
    
    async def run_Sequential():
        data = []
    
        for requestId in ids:
            response = httpGet("https://jsonplaceholder.typicode.com/posts/" + requestId)
            data.push({requestId, response})
    
        return data
    
    async def run_Parallel():
        httpRequests$ = ids
            .map(
                requestId => httpRequest$("GET", "https://jsonplaceholder.typicode.com/posts/" + requestId)
                                                    .pipe(
                                                        map(r => {requestId, response: r.data})
                                                    )
            )
    
        return lastValueFrom(forkJoin(httpRequests$))
    
    if __env.entryFunction == '':
        return {
                sequential: run_Sequential(),
                parallel: run_Parallel()
            }
    
    


    작업 예는 여기
    https://run.worksheet.systems/data-studio/app/guest/jspy-playground?file=http-calls%2Fsequential-vs-parallel-http-calls.jspy .
    이 코드를 실행하고 chrome dev-tools - network 탭을 엽니다. 차이가 확연히 보이는 곳



    워크시트 데이터 스튜디오



    워크시트 Data Studio는 데이터 분석, 데이터 처리, SQL 데이터베이스 관리 및 RAPID 앱 개발을 위한 로우 코드 데이터 관리 플랫폼입니다.

    좋은 웹페이지 즐겨찾기