[RAILS] À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets

À propos de gem'sprockets '

Une bibliothèque qui compile des fichiers de bonbons. Cependant, à partir de rails 5.1, webpacker est recommandé pour le compilateur javascript, et à partir de rails 6.0, la valeur par défaut pour le compilateur javascript a été changée en webpacker. Actuellement utilisé par défaut pour le CSS et la compilation d'images.

CSS, image -> sprockets javascript -> webpacker

phénomène

Le résultat de l'exécution ne sera pas renvoyé par la précompilation de l'actif.

Solutions

1. Définissez les paramètres pour désactiver le traitement parallèle.

En définissant l'une des options suivantes dans les paramètres de l'application, le traitement parallèle est désactivé et des problèmes surviennent.

Rails.config.assets.export_concurrent = false
Sprockets.export_concurrent = false

2. Utilisez la version 3 des pignons

La maintenance des gem'sprockets est lente et on s'attend à ce que cela prenne du temps à réparer, c'est donc une série d'utiliser 3 séries.

Détails

Sprockets 4.0 est désormais multithread et parallèle pour améliorer les performances de compilation. See: https://github.com/rails/sprockets/pull/469

Le traitement simultané utilise Concurrent :: Promise puis wait! ʻIn promises.each (&: wait!)`.

promises = args.flatten.map do |path|
  Concurrent::Promise.execute(executor: executor) do
    environment.find_all_linked_assets(path) do |asset|
      yield asset
    end
  end
end
promises.each(&:wait!)

See: https://github.com/rails/sprockets/pull/469/files#diff-0d972076f2fbe7a73281fcc0282e57a1618bba231bc8023a4d5bc5705fb06da7R123-R130

À ce stade, la méthode wait! Attend le délai d'expiration jusqu'à ce que le traitement soit terminé, mais comme aucun argument n'est spécifié, nil est entré et elle attend indéfiniment.

def wait!(timeout = nil)
  wait(timeout).tap { raise self if rejected? }
end

See: https://github.com/ruby-concurrency/concurrent-ruby/blob/ffed3c3c0518030b0ed245637703089fa1f0eeee/lib/concurrent/concern/obligation.rb#L79-L89

Si un blocage se produit pendant la concurrence, le processus de précompilation des actifs ne s'arrêtera jamais. Il semble que plusieurs threads se bloquent en essayant de compiler le même fichier lors du traitement en parallèle. bug de ruby-concurrence? Il y a une possibilité de. https://github.com/ruby-concurrency/concurrent-ruby/issues/870

Il existe également de nombreux problèmes similaires. See: https://github.com/rails/sprockets/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+thread+OR+concurrent

référence

https://github.com/rails/sprockets/issues/640 https://github.com/rails/sprockets/issues/581 https://github.com/ruby-concurrency/concurrent-ruby/issues/870 https://github.com/ruby-concurrency/concurrent-ruby/blob/ffed3c3c0518030b0ed245637703089fa1f0eeee/lib/concurrent/synchronization/lockable_object.rb#L6-L20

Autre

Des discussions sur les pignons peuvent également être trouvées sur la page WTF ci-dessous. https://discuss.rubyonrails.org/t/sprockets-abandonment/74371/24

Recommended Posts

À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
Ordre de traitement dans le programme
À propos de l'idée des classes anonymes en Java
Pensez au problème JAVA = JAVAscript (nécessaire à l'avenir)
À propos de la gestion de Null
À propos de la description de Docker-compose.yml
Traitement parallèle mesuré avec Java
À propos du comportement de ruby Hash # ==
À propos du symbole <%%> dans Rails erb
Implémentation du traitement asynchrone dans Tomcat
Un mémorandum du problème FizzBuzz
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
Le problème que l'attribut du modèle User devient nul dans ActionMailer
A propos du traitement de la copie de fichiers en Java
À propos du niveau de journalisation de java.util.logging.Logger
Le problème que le contenu des paramètres est complètement affiché dans la vue [Rails]
[Introduction à Ruby] À propos du rôle de true et break in the while statement
(Déterminez en 1 minute) Comment utiliser vide?, Vide? Et présent?
À propos de la méthode de division continue apprise en 4e année du primaire
[Java] java.lang.NoClassDefFoundError: Résolution du problème de chute dans org / jsoup / safety / Whitelist
À propos du phénomène que StackOverflowError se produit lors du traitement à l'aide d'expressions régulières Java
Obtenez le résultat de POST en Java
[GCD] Principes de base de la programmation parallèle dans Swift
Implémentation du traitement asynchrone compatible multi-tenant dans Tomcat
À propos du fonctionnement de next () et nextLine ()
J'ai étudié le traitement interne de Retrofit
À propos de l'affichage initial de Spring Framework
Traitement des threads de l'interface utilisateur asynchrone Android
À propos du traitement de BigDecimal (avec réflexion)
À propos du nombre de threads de Completable Future
L'histoire de l'écriture de Java dans Emacs
Ecrire le mouvement de Rakefile dans le runbook
Création d'un exemple de programme en utilisant le problème d'un spécialiste des bases de données dans DDD Improvement 2
Comparaison de chaînes de caractères: j'ai été pris dans le problème de vérification des compétences de Paisa
Soyez prudent avec la mise à niveau si vous utilisez | etc. dans l'URL Tomcat
Création d'un exemple de programme en utilisant le problème d'un spécialiste des bases de données avec DDD Improvement 1
À propos de la signification des variables de type, E, T, etc. utilisées dans les génériques utilisés en Java
[Order method] Définit l'ordre des données dans Rails
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
À propos de la confusion observée dans les serveurs Java de démarrage
Pensez à la combinaison de Servlet et Ajax
L'histoire de la fabrication d'un Othello ordinaire à Java
À propos du guide de démarrage officiel de Spring Framework
A propos de l'ordre de description des propriétés système Java
Une histoire sur le JDK à l'ère de Java 11
Traitement parallèle et parallèle dans divers langages (édition Java)
L'histoire de l'apprentissage de Java dans la première programmation
Ressentez le passage du temps même à Java
À propos de next () et nextLine () de la classe Scanner
Importer des fichiers de la même hiérarchie en Java
Comment écrire un exemple d'implémentation du problème dans E05 (ruby, C11) en temps réel hors ligne