[python] sockety - problem s HTTP spojenim

Jan Kundrát jkt na gentoo.org
Středa Listopad 28 20:08:11 CET 2007


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

-- 
cd /local/pub && more beer > /dev/mouth

------------- další část ---------------
Netextová příloha byla odstraněna...
Jméno: signature.asc
Typ: application/pgp-signature
Velikost: 252 bytes
Popis: OpenPGP digital signature
Url : http://www.py.cz/pipermail/python/attachments/20071128/02d99c56/attachment.pgp 


Další informace o konferenci Python