首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让线程使用由另一个永久运行的线程计算和更新的变量的“首选”方式是什么?

让线程使用由另一个永久运行的线程计算和更新的变量的“首选”方式是什么?
EN

Stack Overflow用户
提问于 2022-08-07 01:46:05
回答 2查看 41关注 0票数 1

我有个变数。该变量将只由一个连续运行的线程计算,其他线程将能够访问它,但不会以任何方式调整它。其他线程不会相互协作,因此其他线程中的一个是否认为a=3而另一个线程认为a= 2并不重要。下面是一个简单的不工作示例,演示我的意思:

代码语言:javascript
复制
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()

有什么“有意”的工具/语法来进行类似的工作?

EN

回答 2

Stack Overflow用户

发布于 2022-08-07 02:59:56

这个问题可以使用生产者-消费者模式和单一元素缓冲区来解决。生产者写一个新的价值,它需要的时候就写。使用者在缓冲区中读取值时,不需要随时修改它。

正如https://sworthodoxy.blogspot.com/2015/05/shared-resource-design-patterns.html中所述,它描述了使用Ada受保护对象解决问题的方法,

无条件缓冲区

当读取任务只需要对写入任务中的数据进行采样时,将使用没有任何访问屏障的单个元素缓冲区。如果读取任务执行速度比写入任务快,则读取任务将多次读取相同的值。如果写入任务执行速度快于读取任务,则将跳过一些值。在对传感器数据进行采样时,通常使用无条件缓冲区。传感器数据可以以比分析速度快很多倍的速度传送到程序。无条件缓冲区简化了传感器读取任务与分析传感器数据任务之间的通信。

代码语言:javascript
复制
   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;

代码语言:javascript
复制
  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。为了安全起见,将异常逻辑置于此函数中。轮询初始化函数比迭代处理异常要有效得多。

票数 0
EN

Stack Overflow用户

发布于 2022-08-07 22:42:51

我知道,我们不能直接这样做,但是我们可以使用property()函数修饰器,任何人都不应该使用gettersetter方法访问数据。

您可以阅读如何在此property()中使用链接函数。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73264370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档