这是在2个线程之间使用变量的正确方法吗?

时间:2018-08-27 14:24:23

标签: python python-3.x multithreading mutex

我有一个脚本从串行端口读取数据,所以我有一个无限循环,总是将我的数据填充到全局变量中,并且我安排了一个每X秒运行一次的函数以发布到数据库中,并且该函数也使用相同的全局变量。

这是我创建的一个小例子,向您展示我的情况:

ClassCastException

此代码会引起问题吗?更具体地讲,如果MainThread(从Serail Port读取并写入import serial import schedule import threading shared_var = [] def save_to_db(): print(threading.current_thread()) global shared_var for l in shared_var: print(l) shared_var.clear() def run_threaded(job_func): job_thread = threading.Thread(target=job_func) job_thread.start() ser = serial.Serial() # initialize the serial ser.baudrate = 115200 # set the baud rate : default 115200 ser.port = "/dev/ttyUSB0" # set the port to use ser.timeout = 30 ser.write_timeout = None if not ser.is_open: ser.open() # Open port ser.write(b'scan=01\r\n') # Stop scan if already started schedule.every(5).seconds.do(run_threaded, save_to_db) while 1: schedule.run_pending() line = ser.readline() shared_var.append(line) print(threading.current_thread()) 的那个线程)写入2个线程之间的共享变量,而同时另一个Thread从变量读取,将发生什么情况?引起问题,因为2个线程将在同一时间访问相同的全局变量?如果是的话,那我应该使用互斥机制吗?

1 个答案:

答案 0 :(得分:1)

是的,如果两个进程同时影响相同的变量,肯定会出现问题。

要解决此问题,您必须使用threading.Lock()(这是Threading的互斥系统)。

lock = threading.Lock()
lock.acquire()
try:
    yourVariable += 1
finally:
    lock.release()

希望我能对您有所帮助。