我有个变数。该变量将只由一个连续运行的线程计算,其他线程将能够访问它,但不会以任何方式调整它。其他线程不会相互协作,因此其他线程中的一个是否认为a=3而另一个线程认为a= 2并不重要。下面是一个简单的不工作示例,演示我的意思:
number = 0
def thread_target():
while True:
global number
number = random.randint(1,60)
def thread_target2():
global number
for i in range(10):
print(number)
sleep(1)
t1 = Thread(target=thread_target)
t2 = Thread(target=thread_target2())
t1.start()
t2.start()
t2.join()有什么“有意”的工具/语法来进行类似的工作?
发布于 2022-08-07 02:59:56
这个问题可以使用生产者-消费者模式和单一元素缓冲区来解决。生产者写一个新的价值,它需要的时候就写。使用者在缓冲区中读取值时,不需要随时修改它。
正如https://sworthodoxy.blogspot.com/2015/05/shared-resource-design-patterns.html中所述,它描述了使用Ada受保护对象解决问题的方法,
无条件缓冲区
当读取任务只需要对写入任务中的数据进行采样时,将使用没有任何访问屏障的单个元素缓冲区。如果读取任务执行速度比写入任务快,则读取任务将多次读取相同的值。如果写入任务执行速度快于读取任务,则将跳过一些值。在对传感器数据进行采样时,通常使用无条件缓冲区。传感器数据可以以比分析速度快很多倍的速度传送到程序。无条件缓冲区简化了传感器读取任务与分析传感器数据任务之间的通信。
protected type Read_Any_Buffer is
procedure Put(Item : in Element_Type);
function Get return Element_Type;
function Initialized return Boolean;
private
Value : Element_Type;
Is_Valid : Boolean := False;
end Read_Any_Buffer;无条件缓冲区的一个问题是确定它是否包含有效数据。读取未初始化的数据是不合理的。可以对初始化的函数进行轮询,以确定无条件缓冲区何时已初始化。在此之后,读取任务只是在它想要访问缓冲区中的当前值时调用Get函数。保护主体Read_Any_Buffer是程序放置(项目: in Element_Type)是开始值:=项目;Is_Valid := True;end Put;
function Get return Element_Type is
begin
if not Is_Valid then
raise Uninitialized_Data;
end if;
return Value;
end Get;
function Initialized return Boolean is
begin
return Is_Valid;
end Initialized;end Read_Any_Buffer;此示例具有Get函数,如果在初始化数据之前调用该函数,则引发异常Uninitialized_Data。为了安全起见,将异常逻辑置于此函数中。轮询初始化函数比迭代处理异常要有效得多。
发布于 2022-08-07 22:42:51
我知道,我们不能直接这样做,但是我们可以使用property()函数修饰器,任何人都不应该使用getter和setter方法访问数据。
您可以阅读如何在此property()中使用链接函数。
from time import sleep
import threading
import random
class Number:
def __init__(self,number):
"""
_number is private, anyone should not acces this variable
without getter and setter method
"""
self._number = number
@property
def value(self):
return self._number
@value.setter
def value(self,arg):
if threading.current_thread().name=="Setter_thread":
self._number = arg
else:
print("you have no permission")
number = Number(0)
def thread_target():
while True:
number.value=random.randint(1,60)
sleep(1)
def thread_target2():
for i in range(5):
print(number.value)
sleep(1)
number.value=99 # will no effect
print(number.value)
t1 = threading.Thread(target=thread_target,name="Setter_thread")
t2 = threading.Thread(target=thread_target2)
t1.start()
t2.start()
t1.join()
t2.join()https://stackoverflow.com/questions/73264370
复制相似问题