récupère des articles perdus
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
<!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>
|
||||
<main>
|
||||
<p>Je viens de tomber sur quelque chose d’étrange dans l’utilisation de l’objet <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 j’ai 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 < 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 d’execution 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 l’avoue) c’est que j’aurais pensé que le deuxième <em>File.open</em> ne puisse pas s’executé, et me renvoie une Error du type: <em>“Le fichier est déjà ouvert en écriture par quelqu’un d’autres”</em>… Mais non, et du coup, j’ai un fichier assez moche qui ne ressemble à rien:</p>
|
||||
<pre>
|
||||
elephduck
|
||||
</pre>
|
||||
<p>Alors qu’on 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>J’ai également fait un essai en utilisant le code contenu dans chaque thread pour les executer dans deux console différentes, j’arrive au même résultat (c’est du coup dans test/unit, mais au niveau du contenu de <span class="caps">FILE</span> à la fin, j’ai là même chose…) <a href="http://zone.elsif.fr/write_quickly.rb">Fichier write_quickly.rb pour l’écriture d’ELEPHANT</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. J’avoue ne pas avoir envie d’envoyer 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> d’ailleurs (car j’ai vérifier, j’ai le même problème en JRuby). Du moins tant que je n’ai pas creusé un peu plus.</p>
|
||||
<p>J’ai sûrement du faire une erreur quelque part, oublier quelque chose, ou faire quelque chose de travers. <strong>Si quelqu’un lit cela et à une idée, merci d’en m’en parler, je suis preneur !</strong>.</p>
|
||||
<p>Si c’est un comportement souhaité, j’aimerais comprendre pourquoi, et si c’est un oubli ou une erreur, j’aimerais 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>
|
||||
</main>
|
||||
<footer>
|
||||
<ul>
|
||||
</ul>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user