개요
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 비동기 성능 |
|---|---|---|
| 74.074 MB/s | 112.490 MB/s |
| 37.181 MB/s | 89.521 MB/s |
| 63.145 MB/s | 97.165 MB/s |
| 3.121 MB/s | 2.922 MB/s |
| 3.789 MB/s | 4.071 MB/s |
| 3.697 MB/s | 3.445 MB/s |
| 3.866 MB/s | 4.171 MB/s |
| 573.770 MB/s | 603.578 MB/s |
| 430.870 MB/s | 444.445 MB/s |
| 82.631 MB/s | 102.105 MB/s |
| 75.057 MB/s | 90.345 MB/s |
| 85.810 MB/s | 101.838 MB/s |
| 84.832 MB/s | 101.934 MB/s |
| 120.389 MB/s | 163.553 MB/s |
| 0.036 MB/s | 0.034 MB/s |
| 0.042 MB/s | 0.043 MB/s |
| 0.039 MB/s | 0.041 MB/s |
| 0.043 MB/s | 0.042 MB/s |
| 35.071 MB/s | 38.213 MB/s |
| 0.729 MB/s | 0.446 MB/s |
| 25.032 MB/s | 25.727 MB/s |
| 1.746 MB/s | 1.723 MB/s |
| 34.144 MB/s | 37.666 MB/s |
| 0.539 MB/s | 0.572 MB/s |
| 0.740 MB/s | 0.786 MB/s |
모터 에서 마이그레이션 Motor
경고
모터 사용 중단
모터 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)을(를) 사용하세요.MongoClientAsyncMongoClient은 스레드로부터 안전하지 않으며 여러 스레드에서 사용할 수 있지만 은 스레드로부터 안전하지 않으므로 단일 이벤트 루프 에서만 사용해야 합니다.
경고
모터 사용자는 PyMongo 비동기 API 로 전환할 때 성능 저하를 경험할 수 있습니다. 이는 스레드 기반 실행기 대신 네이티브 asyncio 작업을 사용하는 PyMongo 비동기 API 때문입니다. 스레드 기반 실행기는 동기식 운전자 와 성능 특성이 비슷하지만 속도가 느립니다. 즉, PyMongo 비동기 API 의 이전 기준에 맞지 않는 워크로드에 대해 더 나은 성능을 발휘합니다.
성능 저하가 발생하는 경우 사용 사례에 PyMongo 비동기 API 필요한지 확인합니다. 동기 PyMongo 사용 사례 더 잘 제공한다고 판단되면 비동기 호환성을 위해 동기 운전자 asyncio.loop.run_in_executor() 과 함께 사용하는 것이 좋습니다. 자세한 학습 은 이벤트 루프 API 문서를 참조하세요.
PyMongo 에서 마이그레이션
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 설명서를 참조하세요.