これは最も奇妙なことです!
Pythonで書かれたマルチスレッドのクライアントアプリケーションがあります。スレッドを使用して、ページのダウンロードと処理を同時に行っています。ボトルネックがこのアプリケーションのプロセッサ(帯域幅ではない)であることを除いて、cURLマルチハンドルを使用するので、スレッドプールを使用する方が効率的です。
私は64bi7ロッキング16GBRAMを持っています。ビーフィー。Pandoraを聴き、StackoverflowとBAMをトローリングしながら、80スレッドを起動します。親プロセスがメッセージで終了することがあります
Killed
また、1つのページ(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( )
編集:ああ、そうです...質問をするのを忘れました...明白なはずです:なぜ私のプロセスが殺されるのですか?それはOSレベルで起こっていますか?カーネルレベル?これは、開いているTCP接続の数に制限があるためですか?一度に実行できるスレッド数の制限ですか?の出力はcat /proc/sys/kernel/threads-max
です257841
。だから...そんなことはないと思います...
私はそれを持っていると思います...OK...私は私のドライブにスワップスペースがまったくありません。今、スワップスペースを作成する方法はありますか?私はFedora16を実行しています。スワップがありました...その後、すべてのRAMを有効にすると、魔法のように消えました。テーリング/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)