Docs Menu
Docs Home
/ / /
PyMongo 드라이버
/

PyMongo 비동기로 마이그레이션

PyMongo 비동기 API PyMongo 와 모터 라이브러리를 통합한 것입니다. 이 가이드 에서는 애플리케이션 을 PyMongo 또는 모터 에서 PyMongo 비동기 API 로 마이그레이션 위해 수행해야 하는 변경 사항을 확인할 수 있습니다.

PyMongo 비동기 API 모터 라이브러리를 대체하도록 설계되었습니다. 모터 Tornado를 지원 하기 위해 만들어졌으며, 나중에 asyncio 지원 추가되었습니다. 이로 인해 모터 완전한 asyncio 및 Tornado 지원 제공하지만, 여전히 네트워크 작업을 수행하기 위해 스레드 풀에 의존합니다. 경우에 따라 모터 라이브러리를 사용할 때 성능이 저하될 수 있습니다. 이 문제를 주소 위해 PyMongo 비동기 API asyncio 지원 PyMongo 에 직접 구현합니다. 대부분의 경우 PyMongo 비동기 API 사용하면 모터 보다 성능이 향상됩니다. 성능 벤치마크를 보려면 성능 벤치마크 섹션을 참조하세요.

이 섹션의 정보를 고려하여 PyMongo 비동기 API 로 마이그레이션 할지, 아니면 동기식 PyMongo 계속 사용할지 결정하세요.

다음 기준이 애플리케이션 또는 사용 사례 에 적용되는 경우 동기식 PyMongo 선호됩니다.

  • 애플리케이션 실행이 간단하거나 코드에서 비동기 호출을 사용하지 않으려는 경우

  • 애플리케이션 이 직렬 워크로드 또는 응답 시간이 매우 빠른 워크로드에 의존하는 경우

  • 애플리케이션 디버깅할 때 동기식 로직의 단순성을 선호하는 경우

다음 기준이 애플리케이션 또는 사용 사례 에 적용되는 경우 PyMongo 비동기 API 로 마이그레이션하는 것이 좋습니다.

  • 애플리케이션 이 동시 작업이 수천 개에 달하는 대규모 동시 작업 부하를 구현하는 경우

  • 응답을 기다리거나 데이터를 쓰는 데 오랜 시간을 소비하는 워크로드에 의존하는 애플리케이션

  • 애플리케이션 이 FastAPI와 같은 다른 비동기 라이브러리 또는 프레임워크에 의존하는 경우

다음 표는 PyMongo 비동기 API 와 모터 라이브러리를 사용하여 수행된 다양한 작업에 대한 성능 벤치마크를 보여줍니다. 각 작업 각각 1000 문서를 10 회 반복하여 수행되었습니다. 대부분의 경우 PyMongo 비동기 API 사용하면 모터 보다 성능이 향상됩니다.

작업
모터 성능
PyMongo 비동기 성능

TestFindManyAndEmptyCursor

74.074 MB/s

112.490 MB/s

TestFindManyAndEmptyCursor80Tasks

37.181 MB/s

89.521 MB/s

TestFindManyAndEmptyCursor8Tasks

63.145 MB/s

97.165 MB/s

TestFindOneByID

3.121 MB/s

2.922 MB/s

TestFindOneByID80Tasks

3.789 MB/s

4.071 MB/s

TestFindOneByID8Tasks

3.697 MB/s

3.445 MB/s

TestFindOneByIDUnlimitedTasks

3.866 MB/s

4.171 MB/s

TestGridFsDownload

573.770 MB/s

603.578 MB/s

TestGridFsUpload

430.870 MB/s

444.445 MB/s

TestLargeDocBulkInsert

82.631 MB/s

102.105 MB/s

TestLargeDocClientBulkInsert

75.057 MB/s

90.345 MB/s

TestLargeDocCollectionBulkInsert

85.810 MB/s

101.838 MB/s

TestLargeDocInsertOne

84.832 MB/s

101.934 MB/s

TestLargeDocInsertOneUnlimitedTasks

120.389 MB/s

163.553 MB/s

TestRunCommand

0.036 MB/s

0.034 MB/s

TestRunCommand80Tasks

0.042 MB/s

0.043 MB/s

TestRunCommand8Tasks

0.039 MB/s

0.041 MB/s

TestRunCommandUnlimitedTasks

0.043 MB/s

0.042 MB/s

TestSmallDocBulkInsert

35.071 MB/s

38.213 MB/s

TestSmallDocBulkMixedOps

0.729 MB/s

0.446 MB/s

TestSmallDocClientBulkInsert

25.032 MB/s

25.727 MB/s

TestSmallDocClientBulkMixedOps

1.746 MB/s

1.723 MB/s

TestSmallDocCollectionBulkInsert

34.144 MB/s

37.666 MB/s

TestSmallDocInsertOne

0.539 MB/s

0.572 MB/s

TestSmallDocInsertOneUnlimitedTasks

0.740 MB/s

0.786 MB/s

경고

모터 사용 중단

모터 5월 142026에 더 이상 사용되지 않습니다. 모터 계속 지원되는 동안 모터 사용자는 PyMongo 비동기 API 로 마이그레이션 하는 것이 좋습니다.

PyMongo 비동기 API 모터 라이브러리와 유사하게 작동하지만, 스레드 풀에 작업을 위임하는 대신 Python asyncio 을 직접 사용하므로 지연 시간 과 처리량 향상됩니다. 대부분의 경우 MotorClient 대신 AsyncMongoClient 를 사용하고 애플리케이션의 가져오기 문을 pymongo에서 가져오도록 변경하여 기존 모터 애플리케이션을 PyMongo Async로 직접 마이그레이션 할 수 있습니다.

다음 예시 는 모터 에서 읽기 및 쓰기 (write) 작업에 Motor PyMongo 클라이언트 를 사용할 경우 PyMongo 비동기와 비교했을 때 가져오기의 차이점을 보여줍니다.

# Motor client import
from motor.motor_asyncio import AsyncIOMotorClient
# PyMongo Async client import
from pymongo import AsyncMongoClient

PyMongo 비동기 API 에서 사용할 수 있는 비동기 메서드 목록을 보려면 비동기 메서드 섹션을 참조하세요. PyMongo 에 해당하는 모터 버전에 대해 학습하려면 호환성 가이드의 모터 호환성 섹션을 참조하세요.

다음 섹션에서는 모터 에서 PyMongo 비동기 API 로 마이그레이션할 때 애플리케이션 에서 구현 해야 하는 메서드 서명 변경 사항을 보여줍니다.

다음 모터 메서드 서명은 PyMongo 비동기 API 에서 다르게 작동합니다.

  • AsyncMongoClient.__init__() io_loop 매개 변수를 허용하지 않습니다.

  • AsyncCursor.each() PyMongo 비동기 API 에는 존재하지 않습니다.

  • MotorGridOut.stream_to_handler() PyMongo 비동기 API 에는 존재하지 않습니다.

  • AsyncCursor.to_list(0) PyMongo 비동기 API 에서는 유효하지 않습니다. 대신 to_list(None) 을(를) 사용하세요.

  • MongoClient AsyncMongoClient 은 스레드로부터 안전하지 않으며 여러 스레드에서 사용할 수 있지만 은 스레드로부터 안전하지 않으므로 단일 이벤트 루프 에서만 사용해야 합니다.

경고

모터 사용자는 PyMongo 비동기 API 로 전환할 때 성능 저하를 경험할 수 있습니다. 이는 스레드 기반 실행기 대신 네이티브 asyncio 작업을 사용하는 PyMongo 비동기 API 때문입니다. 스레드 기반 실행기는 동기식 운전자 와 성능 특성이 비슷하지만 속도가 느립니다. 즉, PyMongo 비동기 API 의 이전 기준에 맞지 않는 워크로드에 대해 더 나은 성능을 발휘합니다.

성능 저하가 발생하는 경우 사용 사례에 PyMongo 비동기 API 필요한지 확인합니다. 동기 PyMongo 가 사용 사례 더 잘 제공한다고 판단되면 비동기 호환성을 위해 asyncio.loop.run_in_executor() 과 함께 동기 운전자 사용하는 것이 좋습니다. 자세한 학습 은 이벤트 루프 API 문서를 참조하세요.

PyMongo 비동기 API PyMongo 와 유사하게 동작하지만 네트워크 작업을 수행하는 모든 메서드는 코루틴이므로 대기해야 합니다. PyMongo 에서 PyMongo 비동기로 마이그레이션 하려면 다음과 같은 방법으로 코드를 업데이트 해야 합니다.

  • MongoClient 의 모든 용도를 AsyncMongoClient 로 바꿉니다.

  • 모든 비동기 메서드 호출에 await 키워드를 추가합니다.

  • 함수 내에서 비동기 메서드를 호출하는 경우 함수를 async로 표시합니다.

동기식 PyMongo 에서 PyMongo 비동기 API 로 마이그레이션할 때 다음 사항에 유의하세요.

  • AsyncCursor 를 목록으로 변환하려면 비동기 cursor.to_list() 메서드를 사용해야 합니다.

  • PyMongo 비동기 API 의 AsyncCollection.find() 메서드는 동기식이지만 AsyncCursor을 반환합니다. 커서 를 반복하려면 async for 루프를 사용해야 합니다.

  • AsyncMongoClient 객체 connect 키워드 인수를 지원 하지 않습니다.

  • 스레드 또는 이벤트 루프 간에 AsyncMongoClient 객체를 주식 할 수 없습니다.

  • 비동기 호출에서 반환된 결과의 속성 이나 메서드에 액세스 하려면 다음 예시 와 같이 호출을 괄호로 올바르게 래핑해야 합니다.

    id = (await posts.insert_one(doc)).inserted_id

PyMongo 비동기 API 에서 사용할 수 있는 비동기 메서드의 전체 목록은 API 설명서를 참조하세요.

참고

앞의 API 문서에 나열되지 않은 모든 메서드는 동기식입니다.

비동기 Python 에 대해 자세히 학습하려면 Python asyncio 설명서를 참조하세요.

돌아가기

업그레이드 가이드

이 페이지의 내용