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

时间:2014-08-15 21:10:24

标签: python multithreading

我可以先用示例代码解释一下;

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 个答案:

答案 0 :(得分:1)

由于Global Interpreter Lock (GIL),您更新parameter的方式实际上已经是线程安全的。 GIL意味着Python一次只允许一个线程执行字节码,因此一个线程无法在另一个线程写入的同时从parameter读取。读取和设置属性都是单个原子字节码操作;一个人总会在另一个人发生之前开始并完成。如果需要从多个线程执行多个字节码操作的操作(例如,从多个线程递增parameter),则只需要引入同步原语。