Это самая странная вещь!
У меня есть многопоточное клиентское приложение, написанное на Python.Я использую многопоточность для одновременной загрузки и обработки страниц.Я бы использовал мульти-дескриптор cURL за исключением того, что узким местом является определенно процессор (а не пропускная способность) в этом приложении, поэтому более эффективно использовать пул потоков.
У меня 64-гигабайтная 16-Гб оперативная память i7.Мускулистый.Я запускаю 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. Там был WAP-обмен, затем я включил всю свою оперативную память, и она волшебным образом исчезла.Хвост /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)