ОС начинает убивать процессы при запуске многопоточного процесса python.

Это самая странная вещь!

У меня есть многопоточное клиентское приложение, написанное на 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-max257841. Итак... Я не думаю, что дело в этом....

Думаю, я понял... Хорошо... На моем диске вообще нет места подкачки. Есть ли способ создать пространство подкачки сейчас? Я использую 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)
6
задан KeatsKelleher 26 March 2012 в 23:59
поделиться