【问题标题】:Accessing the previous object value in python在python中访问上一个对象值
【发布时间】:2021-06-16 11:59:07
【问题描述】:

我有一个程序,其中有一个正在运行的线程正在侦听进入事件处理程序的消息。

根据输入,它需要读取特定文件,但不应同时读取。因此,例如,如果我传入 file1 进行读取。它开始读取该文件,我将 reading_status 设置为 True。

读取需要 1 分钟,在这段时间内,如果请求读取 file2,那么它应该检查之前的读取是 True 还是 False。如果 reading_status 是 True 那么它应该退出并且不执行 File2 的读取。

from file_reader import FileReader

def init(cls):
    cls.file_manager = FileReader()


def read_file(cls, file_name):
    if cls.file_manager.is_reading:
        logging.info('Reading is already active')
        return
    # Code for start reading
    cls.file_manager.reading_op(file_name)

class FileReader:
   _file_name = None
   _status = None
   _reading_status = None 
   
   def __init__(self, file_name):
       self.file_name = file_name

   def reading_op(self, file_name):
       # Code for file read
       self._reading_status = True

   def is_reading(self):
       return self._reading_status

我的方法正确吗?如果在要求读取 file2 时仍在读取 file1,我如何获取它的状态?

【问题讨论】:

  • 你的问题是什么?确切地。请堆栈跟踪。如果您想要求进行代码审查,那么Code Review SO 论坛可能更适合此类问题。
  • 我不知道如何知道当 file2 必须开始读取时,之前的文件读取操作是否仍在运行或已完成。
  • 您可能想阅读Semaphores

标签: python python-3.x multithreading file


【解决方案1】:

使用互斥锁来做到这一点。在 Python 中,您可以使用threading.Lock。

开始读取文件时获取锁,之后释放。如果另一个线程想要读取该文件,它必须尝试获取已持有的锁,因此它将失败(如果提供了参数blocking=False),返回False 而不是True。

这是进行简单的线程间协调的标准方法。
@sophros 推荐的信号量不如锁更适合您的问题(锁是 N=1 的信号量的特殊情况)。

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多