Это самая странная вещь!
У меня есть многопоточное клиентское приложение, написанное на Python. Я использую потоки для одновременной загрузки и обработки страниц. Я бы использовал мульти-дескриптор cURL, за исключением того, что узким местом в этом приложении определенно является процессор (а не пропускная способность), поэтому более эффективно использовать пул потоков.
У меня 64-битный i7 с 16 ГБ оперативной памяти. Мускулистый. Я запускаю 80 потоков, слушая Pandora и тролля Stackoverflow и BAM! Родительский процесс иногда заканчивается сообщением
Killed
В других случаях умирает одна страница (которая является собственным процессом в Chrome). В других случаях происходит сбой всего браузера.
Если вы хотите увидеть немного кода, вот его суть:
Вот родительский процесс:
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 )
А вот суть 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( )
РЕДАКТИРОВАТЬ: О, верно.. .забыл задать вопрос...должно быть очевидно: почему мои процессы убиваются? Это происходит на уровне ОС? Уровень ядра? Это связано с ограничением количества открытых TCP-соединений, которые я могу иметь? Это ограничение на количество потоков, которые я могу запускать одновременно? Вывод cat /proc/sys/kernel/threads-max
— 257841
. Итак... Я не думаю, что дело в этом....
Думаю, я понял... Хорошо... На моем диске вообще нет места подкачки. Есть ли способ создать пространство подкачки сейчас? Я использую Fedora 16. Там БЫЛА подкачка... затем я включил всю свою оперативную память, и она волшебным образом исчезла. Хвост /var/log/messages
Я нашел эту ошибку:
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)