全局变量在主线程和多开出来的二线程之间的关系

全局变量在多线程中可能存在数据不一致问题,需要使用同步机制如Lock来保证安全。可以使用队列进行线程间的数据交互,避免直接操作全局变量导致的问题。在Python中,通过threading.Lock进行加锁和释放,确保对全局变量的读写操作是同步的。
摘要由CSDN通过智能技术生成

一、问题

问:我不明白为什么全局变量在主线程 和 多开出来的二线程 之间, 是毫无关系的

答:全局变量是可以被整个程序访问的变量,因此如果在主线程中定义了一个全局变量,那么在其他任何线程中都可以访问它。

然而,每个线程都有自己的独立运行空间,它们可以各自独立地对变量进行读写操作,不会相互影响。因此,如果在一个线程中对全局变量进行了修改,其他线程是不会感知到这个修改的。

如果多个线程同时对全局变量进行读写操作,则可能导致数据不一致的问题,因此需要使用同步机制(如互斥锁)来保护全局变量

参考:(3条消息) 全局变量分别在多进程和多线程中的区别_饶水胜的博客-CSDN博客_全局变量 和多线程多进程有什么区别

二、目的是。 我想在接口函数mechanical_arm_move和 二线程的test_process_demo函数之间有数据交互

这个嘛,我查了一查,可以使用共享内存或者队列进行数据传递

例如,您可以使用一个队列来在两个函数之间进行数据交换,并在一个函数中写入数据,在另一个函数中读取数据。您可以使用同步机制(如互斥锁)来保证数据的完整性和一致性。

另一种方法是使用全局变量,但是这需要在每个线程中都使用同步机制来保护全局变量。你可以再检查一下

三、代码

在 Python 中,使用全局变量在不同的线程之间共享数据是不安全的。此外,线程是独立执行的,因此线程之间不能直接交互。要在线程之间共享数据,您需要使用同步基础架构,例如锁或队列。在你的代码中,你应该使用队列或其他同步机制来共享数据。

参考:https://www.baidu.com/link?url=1xuWJPIBR7vRwmlAs20xZaQt7RyKGTGIUlc5z5S5l6cthJa_lcgNNQhO8jah0S0M3Y8BschXPAvz69EaFvtnZMvHccDGteUH90JlzL-0KGe&wd=&eqid=dd01311c005d45080000000363dc6d8c

可以通过全局变量来实现数据交互,接口函数可以在接收到请求时修改全局变量的值,二线程的test_process_demo函数可以读取并使用这个全局变量的值。注意,在多线程情况下,对全局变量的读写需要进行同步操作,以防止数据不一致问题。

3.1使用 threading 库中的 Lock 类来实现对全局变量的同步操作(有点忘了提供一个思路)

参考(3条消息) 关于Threading中Lock的理解_ciiyi66248的博客-CSDN博客

简单来叔就是不干扰就对了

创建一个 Lock 对象,并将其作为全局变量

from threading import Lock
global_lock = Lock()
##另一个线程就无法读写该变量
global_lock.acquire()

# 读写全局变量的代码

global_lock.release()

这样,当一个线程正在读写全局变量时,另一个线程就无法读写该变量,从而保证了对全局变量的读写是同步的。

注意:在使用 Lock 对象加锁后,不要忘记在代码块末尾调用 release 方法,以释放锁。

你缺的是这个,只提供到这了,代码我看思路是没问题,添加一下上边的试一试。

import threading
action_var = -1  # 0为回到原始位,1为去目标的位置
lock = threading.Lock()  # 定义一个全局锁
@app.post("/mechanicalArm/move")
async def mechanical_arm_move(command: Command):
    global action_var, lock
    with lock:  # 加锁
        if command.cmd == 'IN-PLACE':
            action_var = 1
            return success()
        elif command.cmd == 'RESET':
            action_var = 0
            return success()
        else:
            return fail('不识别的命令')
def test_process_demo():
    global action_var, lock
    try:
        while 1:
            with lock:  # 加锁
                action_var += 1
                print('running ,  global_var = ', action_var)
                time.sleep(3)
                print("-----------------------------")
    except RobotError as e:
        print('省略')
    finally:
        print("run end-------------------------")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈都婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值