在一个线程中从另一个线程更新属性的正确方法
我先用示例代码来解释这个问题:
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
的值),那你才需要引入一些同步机制。