Napisałem około 50 zajęć, których używam do łączenia się i pracy ze stronami internetowymi za pomocą mechanizacji i wątków. Wszystkie działają równolegle, ale nie zależą od siebie nawzajem. Oznacza to, że 1 klasa - 1 strona - 1 wątek. Nie jest to szczególnie eleganckie rozwiązanie, szczególnie w przypadku zarządzania kodem, ponieważ wiele kodów powtarza się w każdej klasie (ale nie na tyle, aby przekształcić je w jedną klasę do przekazywania argumentów, ponieważ niektóre witryny mogą wymagać dodatkowego przetwarzania pobranych danych w środku metod - jak "login" - którego inni mogą nie potrzebować). Jak już powiedziałem, to nie jest eleganckie - Ale działa. Nie muszę dodawać, że z zadowoleniem przyjmuję wszystkie zalecenia, jak napisać to lepiej, bez stosowania 1 klasy dla każdego podejścia do strony internetowej. Dodanie dodatkowej funkcjonalności lub całościowe zarządzanie kodami każdej klasy jest trudnym zadaniem.Jak zmniejszyć wykorzystanie pamięci przez kod z pytonem?
Jednak dowiedziałem się, że każdy wątek zajmuje około 8MB pamięci, więc przy 50 wątkach szukamy około 400MB użycia. Gdyby działał na moim systemie, nie miałbym z tym problemu, ale ponieważ działa na VPS z tylko 1GB pamięci, zaczyna to być problemem. Czy możesz mi powiedzieć, jak zmniejszyć zużycie pamięci lub czy istnieje inny sposób jednoczesnego działania z wieloma witrynami?
Użyłem tego szybkiego testu Pythona program do sprawdzenia, czy to dane przechowywane w zmiennych mojej aplikacji, która korzysta z pamięci, lub coś innego. Jak widać w poniższym kodzie, jest to tylko przetwarzanie funkcji uśpienia(), ale każdy wątek używa 8 MB pamięci.
from thread import start_new_thread
from time import sleep
def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise
def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper,())
n += 1
if not (n % 50):
print n
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n
if __name__ == '__main__':
test()
Kiedy uruchamiam to, wyjście jest:
50
100
150
Exception raised: can't start new thread
Biggest number of threads: 188
I usuwając running = False
linii, można następnie zmierzyć wolnej pamięci za pomocą polecenia free -m
skorupek:
total used free shared buffers cached
Mem: 1536 1533 2 0 0 0
-/+ buffers/cache: 1533 2
Swap: 0 0 0
Rzeczywisty Obliczenie, dlaczego wiem, że zabiera około 8 MB na wątek, jest wtedy proste, dzieląc różnicę pamięci używanej przed i podczas powyższej aplikacji testowej. g, podzielone przez maksymalne wątki, które udało mu się uruchomić.
To prawdopodobnie tylko pamięć przydzielona, ponieważ patrząc na top
, proces python wykorzystuje tylko około 0,6% pamięci.
Co zajmuje pamięć? Zaryzykowałbym zgadnąć, że to dane, które wydobywacie z witryn. Jeśli tak jest, to prawdopodobnie nie ma zbyt wiele możliwości, aby dławić liczbę wykonywanych wątków. –
Jak dokładnie mierzysz wykorzystanie pamięci? Przypuszczam, że te 8 MB nie są naprawdę przydzielone do każdego pojedynczego wątku. Ogromna część tych 8 MB może być dzielona między wątki (tylko odgadnięcie ..)? – Frunsi
Demian i frunsi, zredagowałem moje pytanie, aby odpowiedzieć na oba pytania. Dzięki! – Gargauth