<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>