PYTHON-4784 - Add tests to confirm async parallelism (#1886)
This commit is contained in:
parent
8f32f3cd24
commit
5fa4380324
54
test/asynchronous/test_concurrency.py
Normal file
54
test/asynchronous/test_concurrency.py
Normal file
@ -0,0 +1,54 @@
|
||||
# Copyright 2024-present MongoDB, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
"""Tests to ensure that the async API is properly concurrent with asyncio."""
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import time
|
||||
from test.asynchronous import AsyncIntegrationTest, async_client_context
|
||||
from test.utils import delay
|
||||
|
||||
_IS_SYNC = False
|
||||
|
||||
|
||||
class TestAsyncConcurrency(AsyncIntegrationTest):
|
||||
async def _task(self, client):
|
||||
await client.db.test.find_one({"$where": delay(0.20)})
|
||||
|
||||
async def test_concurrency(self):
|
||||
tasks = []
|
||||
iterations = 5
|
||||
|
||||
client = await self.async_single_client()
|
||||
await client.db.test.drop()
|
||||
await client.db.test.insert_one({"x": 1})
|
||||
|
||||
start = time.time()
|
||||
|
||||
for _ in range(iterations):
|
||||
await self._task(client)
|
||||
|
||||
sequential_time = time.time() - start
|
||||
start = time.time()
|
||||
|
||||
for i in range(iterations):
|
||||
tasks.append(self._task(client))
|
||||
|
||||
await asyncio.gather(*tasks)
|
||||
concurrent_time = time.time() - start
|
||||
|
||||
percent_faster = (sequential_time - concurrent_time) / concurrent_time * 100
|
||||
# We expect the concurrent tasks to be at least 75% faster on all platforms as a conservative benchmark
|
||||
self.assertGreaterEqual(percent_faster, 75)
|
||||
@ -152,7 +152,7 @@ gridfs_files = [
|
||||
|
||||
def async_only_test(f: str) -> bool:
|
||||
"""Return True for async tests that should not be converted to sync."""
|
||||
return f in ["test_locks.py"]
|
||||
return f in ["test_locks.py", "test_concurrency.py"]
|
||||
|
||||
|
||||
test_files = [
|
||||
|
||||
Loading…
Reference in New Issue
Block a user