一、问题
问:我不明白为什么全局变量在主线程 和 多开出来的二线程 之间, 是毫无关系的
答:全局变量是可以被整个程序访问的变量,因此如果在主线程中定义了一个全局变量,那么在其他任何线程中都可以访问它。
然而,每个线程都有自己的独立运行空间,它们可以各自独立地对变量进行读写操作,不会相互影响。因此,如果在一个线程中对全局变量进行了修改,其他线程是不会感知到这个修改的。
如果多个线程同时对全局变量进行读写操作,则可能导致数据不一致的问题,因此需要使用同步机制(如互斥锁)来保护全局变量
参考:(3条消息) 全局变量分别在多进程和多线程中的区别_饶水胜的博客-CSDN博客_全局变量 和多线程多进程有什么区别
二、目的是。 我想在接口函数mechanical_arm_move和 二线程的test_process_demo函数之间有数据交互
这个嘛,我查了一查,可以使用共享内存或者队列进行数据传递。
例如,您可以使用一个队列来在两个函数之间进行数据交换,并在一个函数中写入数据,在另一个函数中读取数据。您可以使用同步机制(如互斥锁)来保证数据的完整性和一致性。
另一种方法是使用全局变量,但是这需要在每个线程中都使用同步机制来保护全局变量。你可以再检查一下
三、代码
在 Python 中,使用全局变量在不同的线程之间共享数据是不安全的。此外,线程是独立执行的,因此线程之间不能直接交互。要在线程之间共享数据,您需要使用同步基础架构,例如锁或队列。在你的代码中,你应该使用队列或其他同步机制来共享数据。
可以通过全局变量来实现数据交互,接口函数可以在接收到请求时修改全局变量的值,二线程的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-------------------------")
全局变量在多线程中可能存在数据不一致问题,需要使用同步机制如Lock来保证安全。可以使用队列进行线程间的数据交互,避免直接操作全局变量导致的问题。在Python中,通过threading.Lock进行加锁和释放,确保对全局变量的读写操作是同步的。
1247

被折叠的 条评论
为什么被折叠?



