Multithreading 控制线程上下文切换

Multithreading 控制线程上下文切换,multithreading,thread-safety,python-multithreading,Multithreading,Thread Safety,Python Multithreading,我有一个脚本,可以与外部设备进行串行通信。该脚本具有多个函数,用于向外部设备读/写数据。这些函数的编写使得每个函数都可以在单独的线程中运行,但在任何给定的时间点,只有一个函数具有串行通信锁定 import threading import time lock=threading.Lock() def f1(): lock.acquire() try: #write some value to device #read another value

我有一个脚本,可以与外部设备进行串行通信。该脚本具有多个函数,用于向外部设备读/写数据。这些函数的编写使得每个函数都可以在单独的线程中运行,但在任何给定的时间点,只有一个函数具有串行通信锁定

import threading
import time
lock=threading.Lock()

def f1():
    lock.acquire()
    try:
        #write some value to device
        #read another value from device and store in var 'val1'
        while val1!=some_value:
            time.sleep(1)
            #read from device and update 'val1'
    finally:
        lock.release()
        

def f2():
    lock.acquire()
    try:
        #write some value to device
        #read another value from device and store in var 'val2'
        while val2!=some_value:
            time.sleep(1)
            #read from device and update 'val2'
    finally:
        lock.release()
        
def f3():
    lock.acquire()
    try:
        #read different values from device and update local variables
    finally:
        lock.release()
    
函数f1(),f2()将根据需要调用,而f3()将在单独的线程中连续运行,这是一种设备健康监视函数

现在,当f1()和f3()在单独的线程中启动时,f3()将等待f1()完成并释放锁。启动f2()和f3()时的情况也是如此。理想情况下,我希望f1()和f2()在进入1秒睡眠之前释放锁,然后在从设备读取值之前重新获取锁

但是,如果这样做,任何在设备中写入/修改数据的其他函数都可以在函数f3()获取锁之前获取锁并修改设备上的参数。我不希望出现这种情况。是否有更好的方法重写上述代码,使f3()函数(仅从设备读取数据)可以在其他函数(如f1()和f2()睡眠时)获取锁

p、 s:我一直在读关于asyncio的书,但是现在我觉得它有点复杂

import threading
import time
lock=threading.Lock()

def f1():
    lock.acquire()
    try:
        #write some value to device
        #read another value from device and store in var 'val1'
        while val1!=some_value:
            time.sleep(1)
            #read from device and update 'val1'
    finally:
        lock.release()
        

def f2():
    lock.acquire()
    try:
        #write some value to device
        #read another value from device and store in var 'val2'
        while val2!=some_value:
            time.sleep(1)
            #read from device and update 'val2'
    finally:
        lock.release()
        
def f3():
    lock.acquire()
    try:
        #read different values from device and update local variables
    finally:
        lock.release()