【问题标题】:Is this the correct way to use variable between 2 Threads?这是在 2 个线程之间使用变量的正确方法吗?
【发布时间】:2019-02-02 02:50:54
【问题描述】:

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

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

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

这段代码会导致问题吗?更具体地说,如果 MainThread(从 Serail 端口读取并写入 shared_var 的线程)写入 2 个线程之间的共享变量,同时另一个线程从变量中读取,会发生什么,这将导致问题是因为 2 个线程会同时访问同一个全局变量吗?如果是的话,我应该为此使用互斥机制吗?

【问题讨论】:

    标签: python python-3.x multithreading mutex


    【解决方案1】:

    是的,如果 2 个进程同时影响同一个变量,你肯定会遇到问题。

    要克服这个问题,您必须使用 threading.Lock()(这是 Threading 的互斥系统)。

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

    希望对你有所帮助。

    【讨论】:

    • 感谢您的回复,我想问您python如何知道yourVariable是锁而不是其他变量?
    • 当你不带参数调用lock.acquire()时,阻塞所有变量直到锁被解锁(lock.release())。
    猜你喜欢
    • 2021-06-29
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多