我可以先用示例代码解释一下;
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()
我遗漏的部分有希望从那里的代码中自我解释..
我的问题是,这是一种安全的方法,使用在线程中运行的服务器来更新可以随时读取值的单独线程上的属性吗?
答案 0 :(得分:1)
由于Global Interpreter Lock (GIL),您更新parameter
的方式实际上已经是线程安全的。 GIL意味着Python一次只允许一个线程执行字节码,因此一个线程无法在另一个线程写入的同时从parameter
读取。读取和设置属性都是单个原子字节码操作;一个人总会在另一个人发生之前开始并完成。如果需要从多个线程执行多个字节码操作的操作(例如,从多个线程递增parameter
),则只需要引入同步原语。