Escribo una tarea de rake que se llamará cada minuto (posiblemente cada 30 segundos en el futuro) por Siempre, y entra en contacto con un punto final de la API de sondeo (por usuario en nuestra base de datos). Obviamente, esto no es eficiente ejecutar como un solo hilo, pero ¿es posible multiprocesar? Si no, ¿hay una buena biblioteca HTTP basada en eventos que pueda hacer el trabajo?tarea de rake multiproceso
Respuesta
estoy escribiendo una tarea rake que se llamaría cada minuto (posiblemente cada 30 segundos en el futuro) por Siempre
Cuidado con los rieles tiempos de arranque, puede ser mejor usar una bifurcación modelo como Resque o Sidekiq, Rescate proporciona https://github.com/bvandenbos/resque-scheduler que debería poder hacer lo que necesita, no puedo hablar de Sidekiq, pero estoy seguro de que tiene algo similar disponible (Sidekiq es mucho más nuevo que Resque)
Obviamente, esto no es eficiente ejecutar como un solo hilo , pero ¿es posible multihilo? Si no, ¿hay una buena biblioteca HTTP basada en eventos que pueda hacer el trabajo?
le sugeriría mirar a ActiveRecord's find_each
para consejos sobre cómo hacer su proceso de buscador más eficiente, una vez que tenga los lotes que se pueden hacer fácilmente algo utilizando hilos tales como:
#
# Find each returns 50 by default, you can pass options
# to optimize that for larger (or smaller) batch sizes
# depending on your available RAM
#
Users.find_each do |batch_of_users|
#
# Find each returns an Enumerable collection of users
# in that batch, they'll be always smaller than or
# equal to the batch size chosen in `find_each`
#
#
# We collect a bunch of new threads, one for each
# user, eac
#
batch_threads = batch_of_users.collect do |user|
#
# We pass the user to the thread, this is good
# habit for shared variables, in this case
# it doesn't make much difference
#
Thread.new(user) do |u|
#
# Do the API call here use `u` (not `user`)
# to access the user instance
#
# We shouldn't need to use an evented HTTP library
# Ruby threads will pass control when the IO happens
# control will return to the thread sometime when
# the scheduler decides, but 99% of the time
# HTTP and network IO are the best thread optimized
# thing you can do in Ruby.
#
end
end
#
# Joining threads means waiting for them to finish
# before moving onto the next batch.
#
batch_threads.map(&:join)
end
Esto iniciará sin más de batch_size
de hilos, esperando después de cada batch_size
para terminar.
Sería posible hacer algo como esto, pero entonces tendrá un número incontrolable de hilos, hay una alternativa de la que puede beneficiarse aquí, se vuelve mucho más complicado, incluido un ThreadPool, y una lista de trabajo compartida para hacer, lo he publicado como en Github no es para spam stackoverflow: https://gist.github.com/6767fbad1f0a66fa90ac
- 1. Rake: iniciando cualquier tarea ejecutando
- 2. Rake: tarea equivalente en Django
- 3. Tarea de Rake: manejo de errores
- 4. Ejecutar tarea de rake en el controlador
- 5. Rails cómo ejecutar la tarea de rake
- 6. Cómo perfilar la tarea de Rake?
- 7. ¿Cómo puedo pasar parámetros a una tarea rake que se invoca usando Rake :: Tarea
- 8. cómo pasar múltiples parámetros para rake tarea
- 9. Rake 0.9.0 'método' no definido 'tarea' '
- 10. ¿Manera simple de apagar observadores durante la tarea de rake?
- 11. tarea predeterminada de espacio de nombres en Rake
- 12. Prueba de un método definido en una tarea de rake
- 13. Tratar con la tarea de rake de ejecución muy larga
- 14. ¿Cómo obtener el PID de la tarea de rake actual?
- 15. Prueba de una tarea de rake en rspec (y pepino)
- 16. Descripción de la tarea de rake de acceso desde la Tarea
- 17. Rails Rake Tarea: acceso a la clase de modelo
- 18. alias del nombre de la tarea en Rake
- 19. ¿Cómo puedo acelerar la tarea de Ruby/Rake?
- 20. factory_girl dentro de una tarea rake - conseguir sin inicializar constantes
- 21. Ejecutar el carpincho en la tarea de rake
- 22. ¿Cómo comienzo la consola IRB desde una tarea de rake?
- 23. ¿Cómo fuerzo a RAILS_ENV en una tarea de rake?
- 24. ¿Los raíles ejecutan los inicializadores para la tarea de rake?
- 25. cómo hacer una vista rabl en una tarea de rake?
- 26. ¿Cuál es la tarea de 'medio ambiente' en Rake?
- 27. ¿Ejecuta una tarea de Rake desde la migración?
- 28. Pasar un parámetro o dos a una tarea de Rake
- 29. ¿Cómo uso "obtiene" en una tarea de rake?
- 30. ¿Es posible realizar una tarea de Rake interactiva?
¡El ThreadPool se ve genial! Voy a probarlo –
Cosas buenas, gracias :) – Robin