Docs Menu
Docs Home
/ / /
PyMongo
/

MongoDB Server 실행 시간 제한

이 페이지의 내용

  • 개요
  • timeout() 메서드
  • 중첩된 시간 초과 차단
  • 스레드 및 작업 안전성
  • timeoutMS 연결 옵션
  • 예외 처리
  • 문제 해결
  • ServerSelectionTimeoutError
  • NetworkTimeout
  • ExecutionTimeout
  • WTimeoutError
  • BulkWriteError
  • API 문서

PyMongo를 사용하여 서버 작업을 수행할 때 서버가 이 작업을 완료해야 하는 시간을 제한할 수도 있습니다. 이렇게 하려면 클라이언트 사이드 작업 시간 제한 을 지정합니다. 제한 시간은 서버 선택, 연결 체크아웃, 직렬화 및 서버 측 실행을 포함하여 작업을 완료하는 데 필요한 모든 단계를 적용합니다. 제한 시간이 만료되면 PyMongo는 제한 시간 예외를 발생시킵니다.

timeout() 메서드를 사용하거나 timeoutMS 연결 옵션을 사용하는 두 가지 방법으로 시간 초과를 지정할 수 있습니다.

코드에 시간 초과를 지정하려면 timeout() 메서드를 호출하여 시간 초과 길이(초)를 전달합니다. 다음 예제와 같이 with 문에서 timeout() 메서드를 호출해야 합니다.

with pymongo.timeout(10):
collection.insert_one({"name": "Yngwie"})

앞의 예에서 삽입 작업이 10 초 내에 완료되지 않으면 PyMongo에서 오류를 발생시킵니다.

지정한 시간 제한은 with 블록 내의 모든 작업에 적용됩니다. 다음 예제에서 삽입 및 찾기 작업은 모두 총 10 초 이내에 완료되어야 합니다.

with pymongo.timeout(10):
coll.insert_one({"name": "Yngwie"})
coll.find_one({"name": "Yngwie"})

실행이 중첩된 제한 시간 블록에 들어가면 외부 제한 시간이 일시 중지됩니다. 실행이 중첩된 제한 시간 블록을 종료하면 이전 제한 시간이 다시 시작됩니다.

중요

중첩된 제한 시간 차단은 외부 제한 시간 차단의 기한을 단축할 수 있지만 연장할 수는 없습니다.

다음 예에서는 timeout() 메서드에 대한 중첩 호출을 사용하는 방법을 보여 줍니다.

1with pymongo.timeout(5):
2 collection.find_one()
3 with pymongo.timeout(3):
4 collection.find_one()
5 collection.find_one()
6 with pymongo.timeout(10):
7 collection.find_one()
8 collection.find_one()

앞의 예제에서 이 코드는 다음 단계를 수행합니다.

  • 1줄: 5초의 시간 제한 차단을 생성합니다.

  • 2줄: 5초 제한 시간 블록 내에서 find_one() 메서드를 호출합니다. 서버는 다음을 충족해야 합니다.
    5초 제한 시간 내에 이 작업을 완료합니다.
  • 3줄: 중첩된 3초 타임아웃 블록을 생성합니다.

  • 4줄: 3초 타임아웃 블록 내에서 find_one() 메서드를 호출합니다. 서버는 다음을 충족해야 합니다.
    3초 이내에 이 작업을 완료합니다.
  • 5줄: 3초 제한 시간 블록 외부에서 find_one() 메서드를 호출합니다. 서버는 다음을 충족해야 합니다.
    원래의 5초 제한 시간 내에 이 작업을 완료합니다.
  • 6행: 중첩된 10초 시간 제한 블록을 생성합니다.

  • 7줄: 10초 제한 시간 블록 내에서 find_one() 메서드를 호출합니다. 중첩된 시간 초과
    블록은 외부 시간 제한 블록을 확장할 수 없으므로 서버는 원래의 5초 제한 시간 내에 이 작업을 완료해야 합니다.
  • 8줄: 10초 제한 시간 블록 외부에서 find_one() 메서드를 호출합니다. 서버는 원래의 5초 제한 시간 내에 이 작업을 완료해야 합니다.

timeout() 메서드는 스레드로부터 안전합니다. 제한 시간은 현재 스레드에만 적용되며 여러 스레드가 서로 다른 제한 시간을 병렬로 구성할 수 있습니다.

timeout() 메서드는 asyncio에도 안전합니다. 시간 제한은 현재 작업에만 적용되며 여러 작업이 동시에 서로 다른 시간 초과를 구성할 수 있습니다.

다음 예시 는 timeout() 모터 와 함께 메서드를 사용하는 방법을 보여줍니다. , 비동기 애플리케이션용 MongoDB Python 운전자 :

import motor.motor_asyncio
client = motor.motor_asyncio.AsyncIOMotorClient()
coll = client["test-db"]["test-collection"]
with pymongo.timeout(10):
await coll.insert_one({"name": "Yngwie"})
await coll.find_one({"name": "Yngwie"})

MongoDB 배포에 연결할 때 제한 시간을 지정하려면 timeoutMS 연결 옵션을 제한 시간 길이(밀리초)로 설정합니다. MongoClient 생성자에 인수를 전달하거나 연결 string 의 매개변수를 사용하는 두 가지 방법으로 이 작업을 수행할 수 있습니다.

다음 코드 예제에서는 timeoutMS 옵션을 사용하여 10 초의 시간 제한을 지정합니다.

client = pymongo.MongoClient("mongodb://<db_username>:<db_password>@<hostname:<port>",
timeoutMS=10000)
uri = "mongodb://<db_username>:<db_password>@<hostname:<port>/?timeoutMS=10000"
client = pymongo.MongoClient(uri)

timeoutMS 옵션을 지정하면 PyMongo는 각 서버 작업에 지정된 시간 제한을 자동으로 적용합니다. 다음 코드 예제에서는 10 초의 시간 제한을 지정한 다음 insert_one()find_one() 메서드를 호출합니다. timeoutMS 옵션을 timeout() 메서드 사용과 비교하여 확인하려면 해당 탭을 선택합니다.

uri = "mongodb://<db_username>:<db_password>@<hostname@:<port>/?timeoutMS=10000"
client = pymongo.MongoClient(uri)
coll = client["test-db"]["test-collection"]
coll.insert_one({"name": "Yngwie"}) # Uses a 10-second timeout.
coll.find_one({"name": "Yngwie"}) # Also uses a 10-second timeout.
client = MongoClient()
coll = client["test-db"]["test-collection"]
with pymongo.timeout(10):
coll.insert_one({"name": "Yngwie"})
with pymongo.timeout(10):
coll.find_one({"name": "Yngwie"})

중요

timeout()은 timeoutMS를 재정의합니다.

timeoutMS 옵션을 지정한 다음 코드에서 timeout() 메서드를 호출하면 PyMongo는 timeout 블록 내의 timeoutMS 값을 무시합니다.

client = MongoClient("mongodb://localhost/?timeoutMS=10000")
coll = client["test-db"]["test-collection"]
coll.insert_one({"name": "Yngwie"}) # Uses the client's 10-second timeout
# pymongo.timeout overrides the client's timeoutMS.
with pymongo.timeout(20):
coll.insert_one({"name": "Yngwie"}) # Uses the 20-second timeout
with pymongo.timeout(5):
coll.find_one({"name": "Yngwie"}) # Uses the 5-second timeout

서버 작업이 지정된 제한 시간을 초과하면 PyMongo는 시간 제한 예외를 발생시키고 PyMongoError.timeout 속성을 True 으)로 설정합니다.

다음 코드 예제에서는 시간 초과 예외를 처리하는 한 가지 방법을 보여 줍니다. 이 코드는 except 블록 내에서 timeout 속성을 확인하여 예외가 시간 초과로 인해 발생했는지 확인합니다.

try:
with pymongo.timeout(10):
coll.insert_one({"name": "Yngwie"})
time.sleep(10)
# The deadline has now expired. The next operation will raise
# a timeout exception.
coll.find_one({"name": "Yngwie"})
except PyMongoError as exc:
if exc.timeout:
print(f"block timed out: {exc!r}")
else:
print(f"failed with non-timeout error: {exc!r}")

다음 섹션에서는 시간 초과를 사용할 때 발생할 수 있는 오류에 대해 설명합니다.

이 오류는 클라이언트가 지정된 제한 시간 내에 작업을 실행할 수 있는 서버를 찾을 수 없음을 나타냅니다.

pymongo.errors.ServerSelectionTimeoutError: No servers found yet, Timeout: -0.00202266700216569s, Topology Description: <TopologyDescription id: 63698e87cebfd22ab1bd2ae0, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None>]>

이 오류는 클라이언트가 지정된 제한 시간 내에 연결을 설정할 수 없거나 작업이 전송되었지만 서버가 제때 응답하지 않았음을 나타냅니다.

pymongo.errors.NetworkTimeout: localhost:27017: timed out

이 오류는 지정된 제한 시간을 초과하여 서버가 작업을 취소했음을 나타낼 수 있습니다. PyMongo에서 이 예외가 발생하더라도 서버에서 작업이 부분적으로 완료되었을 수 있습니다.

pymongo.errors.ExecutionTimeout: operation exceeded time limit, full error: {'ok': 0.0, 'errmsg': 'operation exceeded time limit', 'code': 50, 'codeName': 'MaxTimeMSExpired'}

또한 지정된 제한 시간 내에 작업을 완료할 수 없어 클라이언트가 작업을 취소했음을 나타낼 수도 있습니다.

pymongo.errors.ExecutionTimeout: operation would exceed time limit, remaining timeout:0.00196 <= network round trip time:0.00427

이 오류는 서버가 지정된 제한 시간 내에 지정된 쓰기 고려를 따라 요청된 쓰기 작업을 완료하지 못했음을 나타냅니다.

pymongo.errors.WTimeoutError: operation exceeded time limit, full error: {'code': 50, 'codeName': 'MaxTimeMSExpired', 'errmsg': 'operation exceeded time limit', 'errInfo': {'writeConcern': {'w': 1, 'wtimeout': 0}}}

이 오류는 서버가 지정된 제한 시간 내에 지정된 쓰기 고려에 따라 insert_many() 또는 bulk_write() 메서드를 완료하지 못했음을 나타냅니다.

pymongo.errors.BulkWriteError: batch op errors occurred, full error: {'writeErrors': [], 'writeConcernErrors': [{'code': 50, 'codeName': 'MaxTimeMSExpired', 'errmsg': 'operation exceeded time limit', 'errInfo': {'writeConcern': {'w': 1, 'wtimeout': 0}}}], 'nInserted': 2, 'nUpserted': 0, 'nMatched': 0, 'nModified': 0, 'nRemoved': 0, 'upserted': []}

PyMongo에서 시간 초과를 사용하는 방법에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

Stable API