Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
锁定python中的一段代码_Python_Multithreading_Machine Learning_Locking_Global Variables - Fatal编程技术网

锁定python中的一段代码

锁定python中的一段代码,python,multithreading,machine-learning,locking,global-variables,Python,Multithreading,Machine Learning,Locking,Global Variables,我有一个函数,其中包含负责访问加载在全局变量中的资源的关键块/代码段。我想锁定这个关键代码块,因为我的函数会同时执行多次 我试图避免的是资源从第一个函数调用的数据中生成一些结果,而第二个函数则获取这个结果,因为资源需要一些时间来执行 global_var = SomeMachineLearningModel def famousFunction(): # some initializations here # here also critical_results =

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

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

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
锁定函数内的关键结果是一个好的解决方案还是锁定整个函数体


没有线程被使用,我只希望这个全局变量一次被一个函数调用访问,或者可能是整个函数

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

谢谢

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

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

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

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)
然后,在你著名的函数中:

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

在这个简化的示例中,请注意可能无法释放锁的异常和长时间运行的函数。

注意:对于我的答案,我将假设著名的函数是在多线程环境中调用的或是异步调用的

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

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)
然后,在你著名的函数中:

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

在这个简化的示例中,请注意可能无法释放锁的异常和长时间运行的函数。

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