Repository: planetlabs/planet-client-python
Issue: download multiple assets example bypasses rate limiting by using multiple sessions

**Expected behavior**
[download_multiple_assets.py example](https://github.com/planetlabs/planet-client-python/blob/main/examples/download_multiple_assets.py) should use Session in a way that enables rate-limiting (that, is, use only one Session). See [orders_create_and_download_multiple_orders.py](https://github.com/planetlabs/planet-client-python/blob/main/examples/orders_create_and_download_multiple_orders.py) for an example

**Actual behavior (describe the problem)**
[download_multiple_assets.py example](https://github.com/planetlabs/planet-client-python/blob/main/examples/download_multiple_assets.py) creates a Session for each download task, thus bypassing rate-limiting.


Changed files:
examples/download_multiple_assets.py

diff --git a/examples/download_multiple_assets.py b/examples/download_multiple_assets.py
index c5fb876..995988b 100644
--- a/examples/download_multiple_assets.py
+++ b/examples/download_multiple_assets.py
@@ -33,34 +33,37 @@ wildfire_item_type = 'PSScene'
 wildfire_asset_type = 'basic_analytic_4b'
 
 
-async def download_and_validate(item_id, item_type_id, asset_type_id):
-    async with Session() as sess:
-        # Data client object
-        cl = DataClient(sess)
-
-        # Get asset description
-        asset = await cl.get_asset(item_type_id, item_id, asset_type_id)
+async def download_and_validate(item_id, item_type_id, asset_type_id, client):
+    # Get asset description
+    asset = await client.get_asset(item_type_id, item_id, asset_type_id)
 
-        # Activate asset
-        await cl.activate_asset(asset)
+    # Activate asset
+    await client.activate_asset(asset)
 
-        # Wait for asset to become active
-        asset = await cl.wait_asset(asset, callback=print)
+    # Wait for asset to become active
+    asset = await client.wait_asset(asset, callback=print)
 
-        # Download asset
-        path = await cl.download_asset(asset)
+    # Download asset
+    path = await client.download_asset(asset)
 
-        # Validate download file
-        cl.validate_checksum(asset, path)
+    # Validate download file
+    client.validate_checksum(asset, path)
 
 
 async def main():
-    await asyncio.gather(
-        download_and_validate(river_item_id, river_item_type,
-                              river_asset_type),
-        download_and_validate(wildfire_item_id,
-                              wildfire_item_type,
-                              wildfire_asset_type))
+    async with Session() as sess:
+        # Data client object
+        client = DataClient(sess)
+        # Download and validate assets in parallel
+        await asyncio.gather(
+            download_and_validate(river_item_id,
+                                  river_item_type,
+                                  river_asset_type,
+                                  client),
+            download_and_validate(wildfire_item_id,
+                                  wildfire_item_type,
+                                  wildfire_asset_type,
+                                  client))
 
 
 if __name__ == '__main__':