Thank you for your question.
@Kobe_W is correct, best practice is to call close() when the client is no longer needed or use the client in a with-statement:
with MongoClient(url) as client:
# use client here
It’s also a good idea to call close() on the cursor too, the best way would be to use a with-statement like this:
with collection.find() as cursor:
for s in cursor:
print(s)
When PyMongo’s MongoClient and cursor objects are garbage collected without being closed pymongo will clean up application-side resources automatically (connections, threads, etc…) however some server-side resources could be left open (cursors, sessions). Calling close() explicitly (or using a with-statement) will clean up these server-side resources that would otherwise be left around until they timeout.
I just opened this ticket to improve our documentation around these ideas: https://jira.mongodb.org/browse/PYTHON-3606