ruby 在另一个线程中执行|运行时错误

zaqlnxep  于 2023-01-01  发布在  Ruby
关注(0)|答案(2)|浏览(124)

我的项目里也有类似的东西

class Raj
  def execute
    5.times do
      Thread.new do
        object = Gopal.new
        object.db_connection
        object.enter_tax_id
      end
    end
  end
end

class Gopal
  def db_connection
    @db = "" # Created db connection here
    @browser = Watir::Browser.new
  end

  def enter_tax_id
    m = Mutex.new
    m.synchronize do
      data = @db_conn.select_one("select max(tax_id_no) from pcmp.tax_identifier")
      @browser.text_field(id: 'something').set 'data'
    end
  end
end

enter tax id方法从数据库中提取信息,然后在文本字段中输入值。此线程有问题,因为其他线程正在与它交互;当多个线程试图执行同一过程时,将引发“正在另一个线程中执行”错误。

6ojccjat

6ojccjat1#

要确保一次只有一个线程可以执行特定的代码段,可以使用互斥对象(“mutual exclusion”的缩写)。互斥对象一次只允许一个线程获取它的锁,任何其他试图获取锁的线程都将阻塞,直到锁被释放。
在本例中,可以使用互斥对象来同步对enter_tax_id方法的访问,具体方法如下:

class Gopal
  def initialize
    @mutex = Mutex.new
  end

  def db_connection
    @db = "" # Created db connection here
    @browser = Watir::Browser.new
  end

  def enter_tax_id
    @mutex.synchronize do
      data = @db.select_one("select max(tax_id)+1 from table")
      @browser.text_field(id: 'something').set 'data'
    end
  end
end

通过此更改,当多个线程尝试同时执行enter_tax_id方法时,其中只有一个线程能够获取互斥对象上的锁。其他线程将一直阻塞,直到锁被释放。这将确保一次只有一个线程可以执行synchronize块内的代码。
将代码 Package 在开始/ rescue块中也是一个好主意,这样可以处理在获取锁或执行代码时可能发生的任何异常。

def enter_tax_id
  @mutex.synchronize do
    begin
      data = @db.select_one("select max(tax_id)+1 from table")
      @browser.text_field(id: 'something').set 'data'
    rescue => e
      # Handle exception here
    end
  end
end

希望这能有所帮助!:)

pgky5nke

pgky5nke2#

为了解决这个问题,我使用了以下策略:

class Gopal
  @mutex = Mutex.new
  def self.mutex_var
    @mutex
  end
  def db_connection
    @db = "" # Created db connection here
    @browser = Watir::Browser.new
  end

  def enter_tax_id
    Gopal.mutex_var.synchronize do
      data = @db.select_one("select max(tax_id)+1 from table")
      @browser.text_field(id: 'something').set 'data'
    end
  end
end

现在,只要类被加载,互斥量变量就是持久的,因此即使示例化了另一个对象,互斥量变量仍然存在并提供保护。

相关问题