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: [EMAIL PROTECTED] V péči o štěstí druhých nacházíme své vlastní. -- Platón Čestná smrt je lepší než život v hanbě. -- Tacticus _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
