这真是太奇怪了!
我有一个用Python编写的多线程客户端应用程序。我使用线程来并发下载和处理页面。虽然在这个应用程序中瓶颈肯定是处理器(而不是带宽),所以使用线程池更有效,但我不会使用cURL多句柄。
我有一台64位i7电脑,配备16GB内存。非常强大。当我听Pandora音乐和浏览Stackoverflow时,我启动了80个线程,结果父进程有时会以“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( )
EDIT: 噢,对了...忘记提问了...应该很明显:为什么我的进程会被杀掉?是在操作系统层面上发生的吗?内核级别?这是由于我可以拥有的开放TCP连接数限制吗?是一次只能运行几个线程的限制吗?
cat /proc/sys/kernel/threads-max
的输出是257841
。所以...我不认为是那个问题....我想我已经找到了答案...好的...我的驱动器上根本没有交换空间。现在有办法创建一些交换空间吗?我正在运行Fedora 16。曾经有过交换空间...然后我启用了所有的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)
dmesg(8)
输出以查看内核是否记录了任何信息。 - sarnolddmesg(8)
中的最后几项内容涉及我的wifi适配器与路由器的关联。......而这是几个小时前的事了。 - KeatsKelleher