|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
To my surprise, a long running SQL query via ActiveRecord blocks an entire Ruby process (all the other threads are blocked while the thread that runs the SQL query is waiting for the result set) Has anyone else found this to be the case? (am I mistaken?) Is there any way to avoid this other than spawning a separate process? [Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux] -Steve |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
It is my understanding that Ruby threads are green threads.
see: http://en.wikipedia.org/wiki/Green_threads "Also a green thread may block all other threads if performing a blocking I/O operation. In order to avoid these problems, green threads must use asynchronous I/O operations, but the added complexity increases latency." I seem to remember reading about Ruby threads and IO blocking, but cannot find it. Hope the above answers some questions. Does anyone know of a solution? -Szymon On Nov 6, 3:26 pm, estebanj...@gmail.com wrote: > To my surprise, a long running SQL query via ActiveRecord blocks an > entire Ruby process (all the other threads are blocked while the > thread that runs the SQL query is waiting for the result set) > > Has anyone else found this to be the case? (am I mistaken?) > Is there any way to avoid this other than spawning a separate process? > > [Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux] > > -Steve |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
> To my surprise, a long running SQL query via ActiveRecord=20
> blocks an entire Ruby process (all the other threads are=20 > blocked while the thread that runs the SQL query is waiting=20 > for the result set) >=20 > Has anyone else found this to be the case? (am I mistaken?)=20 > Is there any way to avoid this other than spawning a separate process? >=20 > [Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux] As far as I know, things like Mongrel obtain a global lock -> run the request through rails -> and release the lock. Rails isn't thread safe, and a great deal of hackery depends upon this non-threaded mode of operation. To handle multiple requests, you'll need multiple processes. I'm curious, do you have something attempting to run the same rails in multiple ruby threads at the same time? Brian |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
On 11/6/07, estebanjang@gmail.com <estebanjang@gmail.com> wrote:
> To my surprise, a long running SQL query via ActiveRecord blocks an > entire Ruby process (all the other threads are blocked while the > thread that runs the SQL query is waiting for the result set) > > Has anyone else found this to be the case? (am I mistaken?) > Is there any way to avoid this other than spawning a separate process? The postgres and oracle adapters support async queries which won't block Ruby threads, or you can use any of the pure-Ruby database drivers. Forking processes is probably better though. jeremy |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On Nov 6, 2007 12:30 PM, <estebanjang@gmail.com> wrote:
> > To my surprise, a long running SQL query via ActiveRecord blocks an > entire Ruby process (all the other threads are blocked while the > thread that runs the SQL query is waiting for the result set) > > Has anyone else found this to be the case? (am I mistaken?) > Is there any way to avoid this other than spawning a separate process? > C extensions that block will block the whole process, as they basically interrupt ruby's thread schedular while they are running. Unless the extension is written with this in mind, which most are not. Chris |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
On Nov 6, 2007, at 2:47 PM, Jeremy Kemper wrote: > The postgres and oracle adapters support async queries which won't > block Ruby threads, or you can use any of the pure-Ruby database > drivers. > > Forking processes is probably better though. > i'll be releasing a background job manager for rails in a few days... fyi. a @ http://codeforpeople.com/ -- we can deny everything, except that we have the possibility of being better. simply reflect on that. h.h. the 14th dalai lama |
|
![]() |
| Outils de la discussion | |
|
|