Tag: thread safety

我可以在ActiveRecord(或Mongoid)中为数据库连接和table_name配置线程安全的每个请求配置吗?

又称<> 环境 我的应用程序是这样建模的: user has_many databases database has_many tables table has_many rows row habtm(+value) columns 你明白了! 因此,我希望不是在数据库内建模数据库,而是: 一个包含用户和的用户的sqlite3数据库 每个用户都有许多sqlite数据库 每个用户都会在他的数据库中LCRUD他的表(类似于phpmyadmin) 问题 我想为数据库连接和table_name提供线程安全的每请求配置 class Table < ActiveRecord::Base end # in some controller # set the connection to the user-selected database from some DB list Table.connection = current_user.session.connection # set the name to the user-selected table from […]

如何制作ActiveRecord ThreadSafe

如何使用postgresql在rails 4中创建以下控制器线程安全: def controller_action if Model.exists(column_name:”some_value”) else @model=Model.new(column_name:”some_value”) @model.save end end 我正在运行puma,所以我担心的是,如果两个线程同时运行此控制器,并且不存在具有指定值column_name的行,则将创建两个记录,而我只想要1。

是否可以在每个用户的基础上设置Active Resource HTTP身份validation的线程安全?

Active Resource可以使用在类级别设置的HTTP身份validation。 例如: class Resource < ActiveResource::Base end Resource.user = 'user' Resource.password = 'password' 要么 Resource.site = “http://user:password@site.com/” 但是,如果我根据用户登录使用不同的HTTP身份validation怎么办? 如果我更改Resource.user和Resource.password,是否会导致竞争条件,其中来自一个线程的请求突然开始使用其请求在另一个线程中同时运行的用户的身份validation? 或者这是一个非问题(只要我重置请求之间的身份validation),因为rails服务器不是multithreading的? 即使没有线程安全问题,如果我无法重置它们仍然存在风险,以前用户的凭据将在未来的请求中自动使用。 更新:在对ActiveResource感到沮丧之后,我编写了自己的REST库: https : //github.com/DeepWebTechnologies/well_rested

Ruby的stdlib Logger类是线程安全的吗?

简而言之,Ruby中的标准库Logger类是否是线程安全的? 谷歌出现的唯一有用信息是论坛上有人说它“似乎”是线程安全的。 而且我不想花时间测试记录器来试图弄清楚它是否存在。 暂时我使用的是log4r ,它是线程安全的,但是如果标准库已经这样做了就太过分了。

在multithreadingRails环境中使用Redis的最佳方法是什么? (Puma / Sidekiq)

我在我的应用程序中使用Redis,包括Sidekiq队列和模型缓存。 考虑到将从我的Web应用程序(通过Puma运行)和Sidekiq内部的后台作业调用将要访问Redis的模型,我的模型可以使用Redis连接的最佳方法是什么? 我目前在初始化器中执行此操作: Redis.current = Redis.new(host: ‘localhost’, port: 6379) 然后在整个代码中使用Redis.current.get / Redis.current.set (和类似的)… 据我所知,这应该是线程安全的,因为Redis客户端只使用Monitor一次运行一个命令。 现在,Sidekiq有自己的Redis连接池,并建议这样做 Sidekiq.redis do |conn| conn.get conn.set end 据我所知,这比仅使用Redis.current的方法更好,因为当他们命中Redis时,多个线程上没有多个工作线在一个连接上相互等待。 但是,如何才能将我从Sidekiq.redis获得的这种连接提供给我的模型? (无需在每个方法调用中将其作为参数传递) 我无法在该块中设置Redis.current,因为它是全局的,我回到每个人使用相同的连接(以及它们之间随机切换,甚至可能是非线程安全的) 我应该将从Sidekiq.Redis获得的连接存储到Thread-local变量中,并在任何地方使用该线程局部变量吗? 在那种情况下,我在“Puma”环境中做了什么? 如何设置线程局部变量? 对此有任何想法非常感谢。 谢谢!