Article View: pl.comp.lang.python
Article #27272Re: Odwołaniewątku do samego siebie
From: Daniel Mróz
Date: Wed, 27 Jan 2010 13:26
Date: Wed, 27 Jan 2010 13:26
74 lines
3191 bytes
3191 bytes
On 27.01.2010, królewna <krolewna@ee.pl> wrote:
> Na końcu wspomniałeś coś o lockach. Ja chcąc kasować procesy z listy
> niby je usuwam ale pamięć przez nie zajmowana dalej pozostaje zajęta.
> Gdy drukuje sobie procesy, które dalej tkwią w pamięci przez
> gc.get_objects() zauważam, że jest tam rzeczywiście sporo locków (nie
> wiem jakich ani od czego bo ja żadnych nie tworzę).
Ja pisałem o innych lockach. Jeśli wątki mają macać obiekt dostępny dla nich
wszystkich, to trzeba blokować (np. poprzez threading.Lock()) aby mieć pewność,
że tylko jeden wątek będzie operował na obiekcie w tym samym czasie.
> Głównie zależy mi na tym aby zwolnić pamięć zajętą przez te wątki gdyż
> będą one tworzone dynamicznie i z czasem jeśli nie nastąpi zwolnienie,
> python po prostu zawali mi całą pamięć.
>
> Przykładowo kod:
>
> def a(i):
> pass
>
> ko = []
>
> for i in range(0, 100000):
> ko.append(threading.Thread(target=a, args=(1,)))
> for i in ko:
> i.start()
> i.join()
> for i in range(0,100000):
> k = ko.pop()
> del k
> del ko
>
> powoduje zajęcie prawie 170MB pamięci.
Wywołanie "del" nie gwarantuje Ci, że usuwany obiekt zwolni w tym
czasie pamięć. Nastąpi to dopiero wtedy, kiedy GC uzna, że można to zrobić
(jeśli będą jakieś zapętlone referencje, to może to nigdy nie nastąpić).
"del" jedynie oznacza dany obiekt jako nieużywany.
A co do kodu, to trochę źle to robisz. Popatrz na coś takiego:
class MyThread(threading.Thread):
def __init__(self, arg):
threading.Thread.__init__(self)
self.arg = arg
def run(self):
do_something_with(self.arg)
ko = []
for i in xrange(100000):
ko.append(MyThread(1))
ko[-1].start()
while len(ko):
thr.join(0.25)
if not thr.isAlive():
ko.remove(thr)
Jeśli masz jakieś pytania do powyższego przykładu, daj znać.
Pozdrawiam
Beorn
--
Daniel 'Beorn' Mróz <beorn@alpha.pl> http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*]
[ r++ y+ ]
Technical Details
Message-ID:
<slrnhm0fqc.g56.beorn@pino.cyberdeck.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!news.task.gda.pl!newsfeed00.sul.t-online.de!t-online.de!plix.pl!newsfeed1.plix.pl!wsisiz.edu.pl!newsfeed.atman.pl!not-for-mailReferences:
<hjmvn8$j0k$1@achot.icm.edu.pl> <hjp5rd$1ge$1@news.task.gda.pl> <hjpdhg$jvg$1@news.task.gda.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!news.task.gda.pl!newsfeed00.sul.t-online.de!t-online.de!plix.pl!newsfeed1.plix.pl!wsisiz.edu.pl!newsfeed.atman.pl!not-for-mail From: Daniel Mróz <beorn@alpha.pl> Newsgroups: pl.comp.lang.python Subject: Re: Odwołaniewątku do samego siebie Date: Wed, 27 Jan 2010 13:26:52 +0000 (UTC) Organization: A tak se walimy młotkami d:-/ Lines: 74 Message-ID: <slrnhm0fqc.g56.beorn@pino.cyberdeck.pl> References: <hjmvn8$j0k$1@achot.icm.edu.pl> <hjp5rd$1ge$1@news.task.gda.pl> <hjpdhg$jvg$1@news.task.gda.pl> NNTP-Posting-Host: fw2.itvp.pl Mime-Version: 1.0 X-Trace: node2.news.atman.pl 1264598812 32088 217.17.39.4 (27 Jan 2010 13:26:52 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Wed, 27 Jan 2010 13:26:52 +0000 (UTC) User-Agent: slrn/0.9.8.1pl2.1 (Linux) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit