{"library":"pymysqllock","title":"PyMySQLLock","description":"PyMySQLLock is a Python library that provides a MySQL-backed distributed locking primitive. It enables multiple application instances to coordinate and ensure that only one instance holds a specific lock at a time, performing tasks that require exclusive access. As of version 0.2.0, it aims to be a lightweight solution when MySQL is the primary dependency for application uptime and health, rather than relying on external systems like ZooKeeper or etcd. The project appears stable with a moderate release cadence.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install PyMySQLLock"],"cli":null},"imports":["from PyMySQLLock import Locker"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom PyMySQLLock import Locker\n\n# --- Configuration (use environment variables for security) ---\nMYSQL_HOST = os.environ.get('MYSQL_HOST', 'localhost')\nMYSQL_USER = os.environ.get('MYSQL_USER', 'root')\nMYSQL_PASSWORD = os.environ.get('MYSQL_PASSWORD', 'password')\nMYSQL_DB = os.environ.get('MYSQL_DB', 'test_db')\n\nLOCK_NAME = 'my_critical_task_lock'\nACQUIRE_TIMEOUT = 10 # seconds\n\ndef run_task_with_lock():\n    locker = None\n    try:\n        # Locker uses connection parameters compatible with common MySQL drivers (e.g., PyMySQL)\n        locker = Locker(\n            host=MYSQL_HOST,\n            user=MYSQL_USER,\n            password=MYSQL_PASSWORD,\n            database=MYSQL_DB\n        )\n        lock = locker.lock(LOCK_NAME)\n\n        print(f\"Attempting to acquire lock '{LOCK_NAME}' with a {ACQUIRE_TIMEOUT}s timeout...\")\n        # Try to acquire the lock. Default timeout is -1 (infinite wait).\n        # Setting refresh_interval_secs keeps the connection alive for long-held locks.\n        if lock.acquire(timeout=ACQUIRE_TIMEOUT, refresh_interval_secs=5):\n            print(f\"Successfully acquired lock '{LOCK_NAME}'. Performing critical task...\")\n            # Simulate work\n            import time\n            time.sleep(5)\n            print(\"Critical task completed.\")\n        else:\n            print(f\"Failed to acquire lock '{LOCK_NAME}' within {ACQUIRE_TIMEOUT} seconds. Another instance might hold it.\")\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n    finally:\n        if 'lock' in locals() and lock.is_acquired():\n            print(f\"Releasing lock '{LOCK_NAME}'.\")\n            lock.release()\n        if locker:\n            locker.close_connection()\n            print(\"MySQL connection closed.\")\n\nif __name__ == \"__main__\":\n    print(\"Ensure MySQL server is running and database exists.\")\n    print(\"Set MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB environment variables if not using defaults.\")\n    run_task_with_lock()","lang":"python","description":"This quickstart demonstrates how to acquire and release a named MySQL-backed lock. It configures the MySQL connection using environment variables for security, attempts to acquire a lock with a timeout, performs a simulated task if successful, and ensures the lock is released and the connection closed.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"0.2.0","pypi_latest":"0.2.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.7,"avg_import_s":0.01,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0,"mem_mb":0.3,"disk_size":"17.8M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.7,"import_time_s":0,"mem_mb":0.3,"disk_size":"18M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.3,"disk_size":"19.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.01,"mem_mb":0.3,"disk_size":"20M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.3,"disk_size":"11.5M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.7,"import_time_s":0,"mem_mb":0.3,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"11.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.01,"mem_mb":0.3,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0,"mem_mb":0.2,"disk_size":"17.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"PyMySQLLock","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.7,"import_time_s":0,"mem_mb":0.2,"disk_size":"18M"}]}}