我的项目里也有类似的东西
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方法从数据库中提取信息,然后在文本字段中输入值。此线程有问题,因为其他线程正在与它交互;当多个线程试图执行同一过程时,将引发“正在另一个线程中执行”错误。
2条答案
按热度按时间6ojccjat1#
要确保一次只有一个线程可以执行特定的代码段,可以使用互斥对象(“mutual exclusion”的缩写)。互斥对象一次只允许一个线程获取它的锁,任何其他试图获取锁的线程都将阻塞,直到锁被释放。
在本例中,可以使用互斥对象来同步对enter_tax_id方法的访问,具体方法如下:
通过此更改,当多个线程尝试同时执行enter_tax_id方法时,其中只有一个线程能够获取互斥对象上的锁。其他线程将一直阻塞,直到锁被释放。这将确保一次只有一个线程可以执行synchronize块内的代码。
将代码 Package 在开始/ rescue块中也是一个好主意,这样可以处理在获取锁或执行代码时可能发生的任何异常。
希望这能有所帮助!:)
pgky5nke2#
为了解决这个问题,我使用了以下策略:
现在,只要类被加载,互斥量变量就是持久的,因此即使示例化了另一个对象,互斥量变量仍然存在并提供保护。