<div dir="ltr">a protoze ve svete bezstavovych webovych workeru bychom se na lokalni filesystem spolehat opravdu nemeli, tak kdyz uz kladivo, tak opravdove: cili zamek v nejakej sdilenem ulozisti, treba v te databazi, coz jsme pomerne blizko i tem transakcim.</div><div class="gmail_extra"><br><div class="gmail_quote">2015-02-09 15:01 GMT+01:00 Vladimir Macek <span dir="ltr"><<a href="mailto:macek@sandbox.cz" target="_blank">macek@sandbox.cz</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>Existuje na to i opravdu kladivo:
souborovy zamek.<br>
<br>
Na lokalnim souborovem systemu mas zaruceno, ze v kriticke sekci
se bude pohybovat jen jeden thread. Pouzivam i u webovych aplikaci
v sekcich, kde potrebuju uplnou jistotu.<br>
<br>
Implementaci prevzatou z webu najdes napr. v me sade nastroju:<br>
<br>
<a href="https://github.com/tuttle/python-useful/blob/master/useful/filelock.py" target="_blank">https://github.com/tuttle/python-useful/blob/master/useful/filelock.py</a><br>
<br>
Lze komplet nainstalovat prikazem:<br>
<br>
<tt>$ pip install useful</tt><tt><br>
</tt><br>
Drobna ukazecka:<br>
<br>
<tt>$ virtualenv /tmp/test-lock && /tmp/test-lock/bin/pip
install useful && /tmp/test-lock/bin/python</tt><tt><br>
</tt><tt>New python executable in /tmp/test-lock/bin/python</tt><tt><br>
</tt><tt>Installing setuptools, pip...done.</tt><tt><br>
</tt><tt>Downloading/unpacking useful</tt><tt><br>
</tt><tt> Downloading useful-0.6.4-py2-none-any.whl (40kB): 40kB
downloaded</tt><tt><br>
</tt><tt>Installing collected packages: useful</tt><tt><br>
</tt><tt>Successfully installed useful</tt><tt><br>
</tt><tt>Cleaning up...</tt><tt><br>
</tt><tt>Python 2.7.6 (default, Mar 22 2014, 22:59:38) </tt><tt><br>
</tt><tt>[GCC 4.8.2] on linux2</tt><tt><br>
</tt><tt>Type "help", "copyright", "credits" or "license" for more
information.</tt><tt><br>
</tt>
<pre style="color:#000000;background:#ffffff"><pre><span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> <span style="color:#800000;font-weight:bold">import</span> time
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> <span style="color:#800000;font-weight:bold">from</span> multiprocessing<span style="color:#808030">.</span>dummy <span style="color:#800000;font-weight:bold">import</span> Pool as ThreadPool
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span>
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> <span style="color:#800000;font-weight:bold">from</span> useful<span style="color:#808030">.</span>filelock <span style="color:#800000;font-weight:bold">import</span> FileLock
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span>
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> <span style="color:#800000;font-weight:bold">def</span> worker_normal<span style="color:#808030">(</span>job<span style="color:#808030">)</span><span style="color:#808030">:</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">print</span> <span style="color:#0000e6">"Start"</span><span style="color:#808030">,</span> job
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> time<span style="color:#808030">.</span>sleep<span style="color:#808030">(</span><span style="color:#008c00">1</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">print</span> <span style="color:#0000e6">"End"</span><span style="color:#808030">,</span> job
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">return</span> job<span style="color:#808030">.</span>lower<span style="color:#808030">(</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span>
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> <span style="color:#800000;font-weight:bold">def</span> worker_critical<span style="color:#808030">(</span>job<span style="color:#808030">)</span><span style="color:#808030">:</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> with FileLock<span style="color:#808030">(</span><span style="color:#0000e6">'/tmp/test-lock'</span><span style="color:#808030">)</span><span style="color:#808030">:</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">print</span> <span style="color:#0000e6">"Start"</span><span style="color:#808030">,</span> job
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> time<span style="color:#808030">.</span>sleep<span style="color:#808030">(</span><span style="color:#008c00">1</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">print</span> <span style="color:#0000e6">"End"</span><span style="color:#808030">,</span> job
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">return</span> job<span style="color:#808030">.</span>lower<span style="color:#808030">(</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span>
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> <span style="color:#800000;font-weight:bold">def</span> run_with<span style="color:#808030">(</span>worker<span style="color:#808030">)</span><span style="color:#808030">:</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> start <span style="color:#808030">=</span> time<span style="color:#808030">.</span>time<span style="color:#808030">(</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> pool <span style="color:#808030">=</span> ThreadPool<span style="color:#808030">(</span><span style="color:#008c00">5</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">print</span> pool<span style="color:#808030">.</span><span style="color:#e34adc">map</span><span style="color:#808030">(</span>worker<span style="color:#808030">,</span> <span style="color:#0000e6">'ABCDEFGHI'</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> pool<span style="color:#808030">.</span>close<span style="color:#808030">(</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> pool<span style="color:#808030">.</span>join<span style="color:#808030">(</span><span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span> <span style="color:#800000;font-weight:bold">print</span> <span style="color:#0000e6">"Completion time with %s: %d secs"</span> <span style="color:#808030">%</span> <span style="color:#808030">(</span>worker<span style="color:#808030">,</span> time<span style="color:#808030">.</span>time<span style="color:#808030">(</span><span style="color:#808030">)</span><span style="color:#808030">-</span>start<span style="color:#808030">)</span>
<span style="color:#808030">.</span><span style="color:#808030">.</span><span style="color:#808030">.</span>
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> run_with<span style="color:#808030">(</span>worker_normal<span style="color:#808030">)</span>
Start Start AStart B
Start
DC
Start E
EndEnd End CEndEnd A
D
BE
Start F
Start G
Start H
Start I
End F
EndEnd G
H
End I
<span style="color:#808030">[</span><span style="color:#0000e6">'a'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'b'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'c'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'d'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'e'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'f'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'g'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'h'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'i'</span><span style="color:#808030">]</span>
Completion time with <span style="color:#808030"><</span>function worker_normal at <span style="color:#008000">0xb6f9dae4</span><span style="color:#808030">></span><span style="color:#808030">:</span> <span style="color:#008c00">2</span> secs
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span> run_with<span style="color:#808030">(</span>worker_critical<span style="color:#808030">)</span>
Start A
End A
Start F
End F
Start G
End G
Start H
End H
Start I
End I
Start E
End E
Start D
End D
Start C
End C
Start B
End B
<span style="color:#808030">[</span><span style="color:#0000e6">'a'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'b'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'c'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'d'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'e'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'f'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'g'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'h'</span><span style="color:#808030">,</span> <span style="color:#0000e6">'i'</span><span style="color:#808030">]</span>
Completion time with <span style="color:#808030"><</span>function worker_critical at <span style="color:#008000">0xb6f9ddf4</span><span style="color:#808030">></span><span style="color:#808030">:</span> <span style="color:#008c00">9</span> secs
<span style="color:#808030">></span><span style="color:#808030">></span><span style="color:#808030">></span>
</pre></pre>
<br>
V.<div><div class="h5"><br>
<br>
On 9.2.2015 13:43, Petr Blahos wrote:<br>
</div></div></div><div><div class="h5">
<blockquote type="cite">
<div dir="ltr">Ahoj,
<div><br>
</div>
<div>no, jestli ten kód vypadá opravdu přesně takto, tak dělá
tohle:</div>
<div>* vytvoří úplně nový zámek a acquirene ho.</div>
<div>* udělá to sql</div>
<div>* releasene zámek.</div>
<div>No a druhý případný thread dělá to stejné:</div>
<div>
<div>* vytvoří úplně nový zámek a acquirene ho.</div>
<div>* udělá to sql</div>
<div>* releasene zámek.</div>
</div>
<div>Takže nic ničemu v ničem nezabrání. </div>
<div><br>
</div>
<div>Tohle se ale dělá transakcema, a pokud máš MyISAm engine,
tak spíš zamčením </div>
<div>patřičných tabulek:</div>
<div>"LOCK TABLES platby READ"</div>
<div>...</div>
<div>"UNLOCK TABLES"</div>
<div><br>
</div>
<div>--<br>
</div>
<div>Petr</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">2015-02-09 11:42 GMT+01:00 mtip <span dir="ltr"><<a href="mailto:mtip@atlas.cz" target="_blank">mtip@atlas.cz</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ahoj,<br>
narazil jsem na problém se zámkem.<br>
<br>
Mám aplikaci na web serveru, která ukládá příznak booolean
Zaplaceno<br>
do MySQL databáze.<br>
Občas se ale stane, že potvrzení platby přijde najednou ve
stejný čas<br>
ze dvou zdrojů. Chtěl jsem to vyřešit zámkem, což ale
nepomůže.<br>
<br>
Princip kódu:<br>
<br>
from threading import Lock<br>
lock = Lock()<br>
lock.acquire()<br>
try:<br>
mysql_cursor.execute("SELECT Zaplaceno FROM platby WHERE
Id=%s", (1,))<br>
if mysql_cursor.fetchall()[0]['Zaplaceno'] == 0:<br>
mysql_cursor.execute("UPDATE Zaplaceno=1 FROM platby
WHERE Id=%s", (1,))<br>
mysql_connection.commit()<br>
# dalsi zpracovani platby...<br>
finally:<br>
lock.release()<br>
<br>
<br>
<br>
Pokud je request spuštěn 2x ve stený čas provede se
zpracování platby 2x.<br>
Přičemž ale SELECT je pod zámkem, takže by se neměl provést
mezi SELECT a UPDATE druhého threadu.<br>
Netušíte, kde může být problém?<br>
<br>
Díky za odpovědi.<br>
<br>
Mirek<br>
<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Python mailing list
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a></pre>
</blockquote>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888"><pre cols="75">--
: Vladimir Macek : <a href="http://macek.sandbox.cz" target="_blank">http://macek.sandbox.cz</a> : <a href="tel:%2B420%20608%20978%20164" value="+420608978164" target="_blank">+420 608 978 164</a>
: UNIX && Dev || Training : Python, Django : PGP key 97330EBD
</pre>
</font></span></div>
<br>_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Jakub Vysoky<br><br>mob: +420 605 852 377<br>jab: <a href="mailto:jakub.vysoky@gmail.com" target="_blank">jakub.vysoky@gmail.com</a><br>twit: <a href="https://twitter.com/kvbik" target="_blank">https://twitter.com/kvbik</a></div>
</div>