首页 > 解决方案 > 如何使用 Python 正确使用锁定功能

问题描述

我一直在将 Redis 与 Python 一起使用,我想学习如何锁定给定的密钥。基本上,如果一个键正在做一些工作。我们应该锁定它直到它完成然后释放它。目前我已经做了:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import random
import sys
import time
from threading import Thread

import serialized_redis

redis_connection = serialized_redis.MsgpackSerializedRedis(host='localhost', port=6379, db=0)


def algorihm(random_number_given):
    try:
        is_being_solved = redis_connection.get(f"number_{random_number_given}")["isBeingSolved"]
    except:  # if we dont find isBeingSolved, that would give us an exception, then means its not there
        is_being_solved = False

    if not is_being_solved:

        print(f"Solving -> Lock: number_{random_number_given}")

        redis_connection.set(
            f"number_{random_number_given}",
            {
                "isBeingSolved": True
            }
        )

        time.sleep(10)

        print(f"Solved -> Release: number_{random_number_given}")

        redis_connection.set(
            f"number_{random_number_given}",
            {
                "finished": "Well done!"
            }
        )
        return True

    else:
        print(f"Already in use -> number_{random_number_given}")
        return False


def main():
    while True:
        response = algorihm(f"number_{random.randint(1, 3)}")

        if response:
            print("Yay, finished my job!")
            sys.exit()
        else:
            print("Trying new number!")
            time.sleep(3)


for i in range(5):
    Thread(
        target=main,
    ).start()
    time.sleep(0.1)

我的问题是我确实使用了很多连接,我担心在这期间可能会发生死锁或者可能会使用高强度的 CPU。

另一个问题是我稍后将使用多个具有共享 redis 数据库的脚本,但它们都不同,这意味着我不能对多个脚本使用锁定功能本身。

我想知道如何为 redis 使用适当的锁定功能,以便在使用特定密钥时阻止多个脚本。

标签: python-3.xredis

解决方案


推荐阅读