具有局部变量线程安全的全局方法



我有一个python项目,我正在添加一个包含以下内容的新文件utils.py。它将由不同的线程访问。

def get_return_string(input_string, input_dict):
ret_str = 'some default value'
if 'apple' in input_string:
ret_str = input_dict['apple']
elif 'banana' in input_string:
ret_str = input_dict['banana']
elif 'grapes' in input_string:
ret_str = input_dict['grapes']
elif 'spinach' in input_string:
ret_str = input_dict['spinach']
elif 'orange' in input_string:
ret_str = input_dict['orange']
elif 'berry' in input_string:
ret_str = input_dict['berry']
return ret_str

只有局部变量,它们是从另一个类的实例内部调用的。此方法线程安全吗?

我在这里读到:

局部变量当然是"线程独占的"。没有其他线程可以直接访问它们,这很有帮助,但不足以保证语义线程的安全性。 一个线程中的局部变量不会将其值存储在与另一个线程中同名局部变量相同的位置

但是,保证两个线程具有单独的局部变量存储不足以确保线程安全,因为这些局部变量可以以线程不安全的方式引用全局共享的数据。

如果它是class method而不是global method,此方法的行为也会有所不同:

class Utils():
@classmethod
def get_return_string(cls, input_string, input_dict):
#...same as above...

是的,该函数是线程安全的,因为局部变量实际上不访问任何全局变量,您可以通过打印方法中 ret_str 的值来检查

def get_return_string(input_string, input_dict):
ret_str = 'some default value'
if 'apple' in input_string:
ret_str = input_dict['apple']
elif 'banana' in input_string:
ret_str = input_dict['banana']
elif 'grapes' in input_string:
ret_str = input_dict['grapes']
elif 'spinach' in input_string:
ret_str = input_dict['spinach']
elif 'orange' in input_string:
ret_str = input_dict['orange']
elif 'berry' in input_string:
ret_str = input_dict['berry']
print(ret_str)
return ret_str
from threading import Thread
dct = {'apple':1,'banana':2}
t1 = Thread(target=get_return_string, args=('apple',dct))
t2 = Thread(target=get_return_string, args=('fruit',dct))
t3 = Thread(target=get_return_string, args=('banana',dct))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
#1
#some default value
#2

最新更新