To jest najdziwniejsze!System operacyjny zaczyna zabijać procesy, gdy działa wielowątkowy proces python
Mam wielowątkową aplikację kliencką napisaną w języku Python. Używam wątkowania do jednoczesnego pobierania i przetwarzania stron. Chciałbym użyć multi-handle cURL, z tym że wąskim gardłem jest zdecydowanie procesor (nie przepustowość) w tej aplikacji, więc bardziej efektywne jest użycie puli wątków.
Mam 64b i7 kołyszący 16 GB RAM. Silny. Uruchomienie 80 wątków podczas słuchania Pandory i trollingu Stackoverflow i BAM! Proces rodzic czasami kończy się komunikatem
Killed
Inne czasy jednej stronie (co jest jego własny proces w Chrome) umrze. Innym razem zawiesza się cała przeglądarka.
Jeśli chcesz zobaczyć trochę kod tutaj jest sedno to:
Oto proces nadrzędny:
def start():
while True:
for url in to_download:
queue.put((url, uri_id))
to_download = [ ]
if queue.qsize() < BATCH_SIZE:
to_download = get_more_urls(BATCH_SIZE)
if threading.activeCount() < NUM_THREADS:
for thread in threads:
if not thread.isAlive():
print "Respawning..."
thread.join()
threads.remove(thread)
t = ClientThread(queue)
t.start()
threads.append(t)
time.sleep(0.5)
I tu jest sedno ClientThread:
class ClientThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
try:
self.url, self.url_id = self.queue.get()
except:
raise SystemExit
html = StringIO.StringIO()
curl = pycurl.Curl()
curl.setopt(pycurl.URL, self.url)
curl.setopt(pycurl.NOSIGNAL, True)
curl.setopt(pycurl.WRITEFUNCTION, html.write)
curl.close()
try:
curl.perform()
except pycurl.error, error:
errno, errstr = error
print errstr
curl.close()
EDYCJA: Och, racja ... zapomniałem zadać pytanie ... powinno być oczywiste: Dlaczego moje procesy zostają zabite? Czy dzieje się to na poziomie OS? Poziom jądra? Czy jest to spowodowane ograniczeniem liczby otwartych połączeń TCP, jakie mogę mieć? Czy jest to ograniczenie liczby wątków, które mogę uruchomić jednocześnie? Wyjście cat /proc/sys/kernel/threads-max
to 257841
. Więc ... Nie sądzę, żeby to było ...
Myślę, że mam to ... OK ... Nie mam żadnej przestrzeni wymiany na moim dysku. Czy istnieje sposób na utworzenie przestrzeni wymiany? Używam Fedory 16. Byłem zamieniony ... następnie włączyłem całą moją pamięć RAM i zniknęło to magicznie. Ogonków /var/log/messages
znalazłem ten błąd.
Mar 26 19:54:03 gazelle kernel: [700140.851877] [15961] 500 15961 12455 7292 1 0 0 postgres
Mar 26 19:54:03 gazelle kernel: [700140.851880] Out of memory: Kill process 15258 (chrome) score 5 or sacrifice child
Mar 26 19:54:03 gazelle kernel: [700140.851883] Killed process 15258 (chrome) total-vm:214744kB, anon-rss:70660kB, file-rss:18956kB
Mar 26 19:54:05 gazelle dbus: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)
Sprawdź wyjście 'dmesg (8)', aby zobaczyć jeśli jądro zalogowało się jakiekolwiek informacje. – sarnold
Dzięki ... zrobi ... – KeatsKelleher
ostatnie wpisy w 'dmesg (8)' odnoszą się do mojego adaptera Wi-Fi z moim routerem. ... które było kilka godzin temu – KeatsKelleher