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

时间:2019-04-03 06:31:14

标签: python-3.x multithreading

我有一个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

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

我读过here

  

局部变量肯定是“线程专有的”。没有其他线程可以直接访问它们,这很有用,但不足以保证语义线程的安全。   一个线程中的局部变量不会将其值存储在另一个线程中具有相同名称的局部变量的位置

  

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

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

class Utils():

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

1 个答案:

答案 0 :(得分:1)

是的,该函数是线程安全的,因为局部变量实际上并未访问任何全局变量,您可以通过在方法中打印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