[python] sockety - problem s HTTP spojenim

Filip Štědrosnký regnarg na seznam.cz
Středa Listopad 28 20:27:13 CET 2007


On Wed, Nov 28, 2007 at 08:08:11PM +0100, Jan Kundr�t wrote:
> Filip Štědrosnký wrote:
> > buffer="příkaz1\npříkaz2\n"
> > buffer+="příkaz3\n"
> 
> Omlouvam se, ze si tuto hypotezu neoverim, ale neda mi nez reagovat.
> Tenhle pristup obecne neni thread-safe. Budeme predpokladat, ze operator
> "+=" opravdu provede pouze hloupy append za konec stavajiciho stringu, a
> ze tedy "buffer" je opravdu obycejny string a ne nejaka specialni
> aio-specificka struktura, ktera si zamykani resi sama.
> 
> Problemem je, ze "append stringu" zdaleka neni atomicka operace, teda
> takova, ktera kdyz jednou zacne, tak bez preruseni dobehne (coz mimojine
>  je opravdu malo veci, i obycejne "pricteni jednicky k intu" neni
> atomicke). Muze klidne nastat situace, kdy operace += muze vyzadovat
> relokaci pameti, a potom se muze stat nasledujici:
> 
> Hlavni thread: volam operator+=().
> Hlavni thread: operator+=(): vidim, ze v bufferu uz neco je, a pridani
> dat si vyzada zvetseni pridelene pameti. Naalokuju tedy interne novy
> buffer a prekopiruju do nej stavajici data. Chystam se za konec pridat
> data nova, kdyz tu...
> Thread AIO se dostava ke slovu. Vidi data v bufferu, tak je precte,
> odstrani, odesle. Chysta se dale delat svou praci, kdyz tu ho planovac
> uspi a pusti ke slovu...
> Hlavni thread: ani nevi, ze byl prerusen. Takze placnu za svou kopii(!)
> puvodnich dat data nova a cely interni nove naalokovany buffer priradim
> do promenne "buffer", ktera se vsak mezitim vyprazdnila. Ja o tom ale
> vubec nevim.
> 
> Vysledek: V bufferu jsou stara data, ktera tam nemaji co delat.
> 
> Hezky vecer a pouzivejte zamykani, pripadne vhodnejsi datove struktury,


Zdravím a omlouvám se za další narušení hypotézy, ale:
1) myslel jsem, že se nejedná o threaded aplikaci ale asyncore/asynchat,
   alespoň jsem to tak z kontextu pochopil

2) stringy jsou neměnitelné, takže to není append, ve skutečnosti se
   spojí, vytvoří se nový string a ten se teprve přiřadí, to už atomická
   operace je

3) vzhledem k pythonímu GIL je vše (mnohdy až příliš) thread-safe a pokud
   nepoužíváte nějaké neobvyklé C extenze, nemusíte zamykat skoro nic


-- 
regnarg -- Homepage: http://rg.pretel.cz -- JID: regnarg na jabber.cz
V péči o štěstí druhých nacházíme své vlastní.         -- Platón
Čestná smrt je lepší než život v hanbě.                -- Tacticus



Další informace o konferenci Python