Files
lespiedsdanslecode/content/2009/2009-06-09-ruby-file-open-w-acces-concurrent.html
2020-03-27 22:43:43 +01:00

114 lines
5.8 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta name="generator" content="Hugo 0.22.1" />
<meta charset="utf-8">
<title>Yannick François - Elsif.fr</title>
<meta name="DC.title" content="elsif.fr, site de Yannick François aka yaf (ou ya_f)."/>
<meta name="description" content="Le site de Yannick François. Développeur Senior, Responsable Produit, Pédagogue. Je travail chez Scopyleft"/>
<meta name="keywords" content="code, développement, programmation, apprentissage, apprendre, lean, agile, logiciel, tdd, objet, refactoring, libre, creative commons, linux, unix"/>
<meta name="author" content="Yannick François, https://elsif.fr"/>
<meta name="designer" content="Yannick François, https://elsif.fr"/>
<meta name="geo.placename" content="Poissy, Ile de france, France"/>
<meta name="robots" content="index,follow" />
<meta name="language" content="French" />
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<link rel="index" title="Yannick François / Développeur / Pédagogue" href="index.html" />
<link rel="stylesheet" href="/css/201912-elsif.css" media="all"/>
<link rel="alternate" type="application/rss" href="/feed.xml" title="elsif.fr/feed" />
</head>
<body>
<article>
<h1>Ruby File.open w Acces concurrent</h1>
<p>Je viens de tomber sur quelque chose d’étrange dans lutilisation de lobjet <a href="http://www.ruby-doc.org/core/classes/IO.html#M002264">IO</a> de <a href="http://ruby-lang.org">Ruby</a> : La gestion des verrous sur les fichiers. Alors jai surement du rater quelque chose, mais voici mon histoire…</p>
<pre>
{% highlight ruby %}
require 'test/unit'
DUCK="duck"
ELEPHANT="elephant"
SNAKE="snake"
FILE="test_file"
class TestFileConcurrencyAccess &lt; Test::Unit::TestCase
def test_concurrency_access
t1 = Thread.start do
File.open(FILE, "w") do |file|
file.puts SNAKE
file.flush
sleep 8
file.puts DUCK
end
end
File.open(FILE,"r") do |f1|
assert SNAKE, f1.read
end
t2 = Thread.start do
File.open(FILE,"w") do |f|
sleep 2
f.puts ELEPHANT
end
end
t2.join
File.open(FILE,"r") do |f2|
assert ELEPHANT, f2.read
end
t1.join
File.open(FILE,"r") do |f3|
assert SNAKE, f3.readline
assert DUCK, f3.readline
end
end
end
{% endhighlight %}
</pre>
<p><a href="/files/test_file_concurrency_access.rb">fichier source</a></p>
<p>Le resultat dexecution de ce test donne une erreur sur la dernière lecture:</p>
<pre>
{% highlight bash %}
Loaded suite test_file_concurrency_access
Started
E
Finished in 8.003509 seconds.
1) Error:
test_concurrency_access(TestFileConcurrencyAccess):
EOFError: end of file reached
test_file_concurrency_access.rb:38:in `readline
test_file_concurrency_access.rb:38:in `test_concurrency_access
test_file_concurrency_access.rb:36:in `open
test_file_concurrency_access.rb:36:in `test_concurrency_access
1 tests, 3 assertions, 0 failures, 1 errors
{% endhighlight %}
</pre>
<p>Mais ce qui me gène (et qui ne ressort pas dans mon test, je lavoue) cest que jaurais pensé que le deuxième <em>File.open</em> ne puisse pas sexecuté, et me renvoie une Error du type: <em>“Le fichier est déjà ouvert en écriture par quelquun dautres”</em>… Mais non, et du coup, jai un fichier assez moche qui ne ressemble à rien:</p>
<pre>
elephduck
</pre>
<p>Alors quon pourrait penser obtenir un truc dans le genre:</p>
<pre>
snake
duck
</pre>
<p>Avec éventuellement une erreur sur l’écriture d’éléphant dans le fichier.</p>
<p>Jai également fait un essai en utilisant le code contenu dans chaque thread pour les executer dans deux console différentes, jarrive au même résultat (cest du coup dans test/unit, mais au niveau du contenu de <span class="caps">FILE</span> à la fin, jai là même chose…) <a href="http://zone.elsif.fr/write_quickly.rb">Fichier write_quickly.rb pour l’écriture dELEPHANT</a> <a href="http://zone.elsif.fr/write_slowly.rb">Fichier write_slowly.rb pour l’écriture de SNAKE et DUCK</a></p>
<p>Bref, je suis perplexe. Javoue ne pas avoir envie denvoyer cela sur la <a href="http://www.ruby-lang.org/fr/community/mailing-lists/">mailing-liste Ruby-talk</a>, ni sur celle de <a href="http://jruby.org">JRuby</a> dailleurs (car jai vérifier, jai le même problème en JRuby). Du moins tant que je nai pas creusé un peu plus.</p>
<p>Jai sûrement du faire une erreur quelque part, oublier quelque chose, ou faire quelque chose de travers. <strong>Si quelquun lit cela et à une idée, merci den men parler, je suis preneur !</strong>.</p>
<p>Si cest un comportement souhaité, jaimerais comprendre pourquoi, et si cest un oubli ou une erreur, jaimerais bien aider à trouver une solution.</p>
<p><em>ps: Retour au thème Scribbish que je trouve plus lisible, en attendant que je refasse quelque chose…</em></p>
</article>
<footer>
<ul>
</ul>
</footer>
</body>
</html>