개요
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)
을(를) 사용하세요.MongoClient
AsyncMongoClient
은 스레드로부터 안전하지 않으며 여러 스레드에서 사용할 수 있지만 은 스레드로부터 안전하지 않으므로 단일 이벤트 루프 에서만 사용해야 합니다.
경고
모터 사용자는 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 설명서를 참조하세요.