在一个线程中从另一个线程更新属性的正确方法

0 投票
1 回答
730 浏览
提问于 2025-04-18 17:27

我先用示例代码来解释这个问题:

class reciever(threading.Thread,simple_server):
    def __init__(self,callback):
        threading.Thread.__init__(self)
        self.callback=callback

    def run(self):
        self.serve_forever(self.callback)

class sender(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.parameter=50

    def run(self):
        while True:
            #do some processing in general
            #....
            #send some udp messages derived from self.parameter
            send_message(self.parameter)

if __name__=='__main__':
    osc_send=sender()
    osc_send.start()

    def update_parameter(val):
        osc_send.parameter=val

    osc_recv=reciever(update_parameter)
    osc_recv.start()

我省略的部分希望从现有的代码中能自然而然地理解。

我的问题是,这种在一个线程中运行服务器,并在另一个线程中更新属性的方式是否安全?因为另一个线程可能随时在读取这些值。

1 个回答

3

你更新那个 parameter 的方式其实已经是线程安全的了,这要归功于一个叫做全局解释器锁(GIL)的东西。GIL的意思是,Python一次只允许一个线程执行字节码,这样就不可能出现一个线程在读取 parameter 的同时,另一个线程在写它的情况。读取和设置一个属性都是单个的、原子性的字节码操作;一个操作总是会在另一个操作开始之前完成。如果你需要进行的操作涉及多个字节码操作,并且是由多个线程同时进行的(比如说从多个线程增加 parameter 的值),那你才需要引入一些同步机制。

撰写回答