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