【问题标题】:Locking piece of code in python在python中锁定一段代码
【发布时间】:2017-10-23 11:09:17
【问题描述】:

我有一个函数,其中包含负责访问加载在全局变量中的资源的关键块/代码段。我想锁定这个关键代码块,因为我的函数会同时执行多次。

我要避免的是资源从第一个函数调用和第二个函数获取此结果的数据中生成一些结果,因为资源需要一些时间来执行。

global_var = SomeMachineLearningModel

def famousFunction():
    # some initializations here
    # here also

    critical_results = global_var.use() # May take few seconds to complete

    # some critical_results manipulation
    return manipulated_results

在函数内锁定critical_results是一个好的解决方案还是锁定整个函数体?

没有使用线程,我希望这个 global_variable 一次由一个函数调用访问,或者可能是整个函数。

我不确定要使用哪种锁定方法。

谢谢!!

编辑: 当第一个函数调用正在等待模型(机器学习模型)产生结果并且第二个函数调用也在等待并且当第一个结果到达时它被错误的函数调用消耗时,就会发生竞争条件。

【问题讨论】:

  • 您的意思是要缓存global_var.use() 在函数调用之间返回的内容吗?
  • “没有使用线程”请解释...如果是这种情况,我能想到的唯一问题是递归函数多次调用这个全局变量(这将只是如果你锁定它会导致死锁)
  • @DuncanWP 如果第一次调用 FamousFunction() 应该生成 10,第二次调用应该生成 20,我希望第一次调用的答案是 10,而不是第二个函数可能同时执行。因为这个 global_var.use() 对两者都是全局可用的。 (是从文件目录加载的机器学习模型)
  • 您需要解释“同时”部分。如果您的应用程序不是多线程的,那么您是否有多个进程正在运行?
  • 如果你没有多个线程或多个进程,你的任何代码都不可能乱序执行。

标签: python multithreading machine-learning locking global-variables


【解决方案1】:

注意:对于我的回答,我将假设在多线程环境中或异步调用着名的Function 函数。

我建议使用上下文管理器和某种文件锁/互斥锁。可能有一些库提供了比我下面的示例更简洁的文件锁定解决方案。

import os

class Lock:
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        if os.path.exists(self.filename):
            print('Method locked! Try again later.')
            return
        open(self.filename, 'a').close()

    def __exit__(self):
        os.remove(self.filename)

然后,在你著名的Function 函数中:

with Lock('tempfile'):
    critical_results = global_var.use()

通过这个简化的示例,请注意可能不会释放锁的异常和长时间运行的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2014-09-17
    • 2020-09-11
    • 2016-07-26
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多