我最好先用示例代码来解释这一点
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()
我漏掉的部分很有希望从代码中不言自明。。你知道吗
我的问题是,使用运行在线程中的服务器更新可能随时读取值的单独线程上的属性,这是一种安全的方法吗?你知道吗
由于Global Interpreter Lock (GIL),更新
parameter
的方式实际上已经是线程安全的了。GIL意味着Python一次只允许一个线程执行字节码,因此一个线程不可能同时从parameter
读取另一个线程正在向其写入的代码。读取和设置属性都是单原子字节码操作;一个操作总是在另一个操作发生之前启动和完成。如果需要从多个线程执行多个字节码操作(例如从多个线程递增parameter
),则只需要引入同步原语。你知道吗相关问题 更多 >
编程相关推荐