我有一个函数,其中包含负责访问全局变量中加载的资源的关键块/代码段。我想锁定这个关键代码块,因为我的函数同时执行多次。
我试图避免的是资源从第一个函数调用的数据生成一些结果,第二个函数获取此结果,因为资源需要一些时间来执行。
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,或者可能是整个函数。
我不确定要使用哪种锁定方法。
谢谢!!
编辑: 当第一个函数调用正在等待模型(机器学习模型)产生结果并且第二个函数调用也在等待时,就会发生争用条件,当第一个结果到达时,它被错误的函数调用消耗。
注意:对于我的答案,我将假设著名的函数是在多线程环境中或异步调用的。
我建议使用上下文管理器和某种文件锁定/互斥锁。可能有一些库提供了比我下面的示例更干净的文件锁定解决方案。
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()
通过这个简化的示例,请注意可能无法释放锁的异常和长时间运行的函数。