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

2024-04-20 01:50:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我最好先用示例代码来解释这一点

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()

我漏掉的部分很有希望从代码中不言自明。。你知道吗

我的问题是,使用运行在线程中的服务器更新可能随时读取值的单独线程上的属性,这是一种安全的方法吗?你知道吗


Tags: run代码selfsendparameterinitdefcallback
1条回答
网友
1楼 · 发布于 2024-04-20 01:50:09

由于Global Interpreter Lock (GIL),更新parameter的方式实际上已经是线程安全的了。GIL意味着Python一次只允许一个线程执行字节码,因此一个线程不可能同时从parameter读取另一个线程正在向其写入的代码。读取和设置属性都是单原子字节码操作;一个操作总是在另一个操作发生之前启动和完成。如果需要从多个线程执行多个字节码操作(例如从多个线程递增parameter),则只需要引入同步原语。你知道吗

相关问题 更多 >