{"library":"oslo-concurrency","title":"Oslo Concurrency Library","description":"The oslo.concurrency library provides utilities for safely running multi-thread and multi-process applications using locking mechanisms, as well as for running external processes. It is a core component of the OpenStack Oslo project, which generally follows a six-month release cadence for major OpenStack releases.","language":"python","status":"active","last_verified":"Sat May 16","install":{"commands":["pip install oslo-concurrency"],"cli":null},"imports":["from oslo_concurrency import lockutils","from oslo_concurrency import processutils"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom oslo_concurrency import lockutils\n\n# For inter-process locking, a lock_path must be configured.\n# For this example, we'll use a temporary directory.\n# In a real application, this should be a secure, dedicated directory.\nlock_dir = os.environ.get('OSLO_LOCK_PATH', '/tmp/oslo_locks')\nos.makedirs(lock_dir, exist_ok=True)\n\n# Configure oslo.concurrency to use the lock path\n# This is typically done via oslo.config in a real OpenStack project,\n# but we can set it directly for a quick example.\nlockutils.set_defaults(lock_path=lock_dir)\n\n@lockutils.synchronized('my-resource', external=True)\ndef my_locked_function(worker_id):\n    print(f\"Worker {worker_id} acquired the lock.\")\n    # Simulate some work\n    import time\n    time.sleep(0.5)\n    print(f\"Worker {worker_id} released the lock.\")\n\nif __name__ == '__main__':\n    # Example of calling the locked function from multiple 'processes'\n    # In a real scenario, these would be separate processes.\n    print(\"Attempting to call my_locked_function from multiple 'workers'...\")\n    for i in range(3):\n        my_locked_function(f\"SimulatedWorker-{i}\")\n\n    # Clean up the lock directory (optional for demo)\n    try:\n        os.rmdir(lock_dir)\n    except OSError:\n        # Directory might not be empty if locks were created\n        pass\n","lang":"python","description":"This quickstart demonstrates how to use `oslo_concurrency.lockutils.synchronized` for inter-process locking. It configures a `lock_path` and defines a function that will be synchronized across different 'workers'. Note that for actual multi-process execution, you would typically run separate Python processes that each call `my_locked_function`.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":"7.2.0","pypi_latest":"7.4.1","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":4.3,"avg_import_s":0.47,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.38,"mem_mb":8.1,"disk_size":"41.6M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.2,"import_time_s":0.28,"mem_mb":8.1,"disk_size":"43M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.67,"mem_mb":9,"disk_size":"45.7M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.1,"import_time_s":0.58,"mem_mb":9,"disk_size":"47M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.5,"mem_mb":8.8,"disk_size":"46.0M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.1,"import_time_s":0.58,"mem_mb":8.8,"disk_size":"47M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.49,"mem_mb":9.1,"disk_size":"45.7M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.3,"import_time_s":0.52,"mem_mb":9.1,"disk_size":"47M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.33,"mem_mb":7.6,"disk_size":"43.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"oslo-concurrency","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.9,"import_time_s":0.34,"mem_mb":7.6,"disk_size":"45M"}]}}