Gevent导致Python崩溃。核心转储(引用计数太小)。问题出在哪里?
我正在尝试为一个地点自动补全的接口搭建一个代理/缓存服务器。下面是一个简化的代码示例,每次我尝试查询我的服务器时几乎总是会出现错误:
#!/usr/bin/python
import gevent
from gevent import monkey
from gevent.wsgi import WSGIServer
monkey.patch_all()
import urllib2
import urlparse
import json
def requestHandler(env, start_response):
start_response('200 OK', [('Content-Type', 'text')])
parameters = urlparse.parse_qs(env['QUERY_STRING'])
if 'search' in parameters:
searchString = parameters['search'][0]
# Query the auto-completion server
json_results = urllib2.urlopen('http://autocomplete.wunderground.com/aq?query=' + searchString).read()
results = json.loads(unicode(json_results, "ISO-8859-1"))
finalResult = ''
for result in results['RESULTS']:
finalResult += result['name'] + ';' + result['c'] + ';' + result['zmw'] + ';' + result['tzs'] + ';'
return [finalResult.encode('utf-16')]
else:
return ['ERROR']
server = WSGIServer(('', 8888), requestHandler)
print 'Server running on port 8888...'
server.serve_forever()
有时候第一次查询可以成功,但第二次请求时就崩溃了。有时候第一次请求就立刻崩溃。这是我收到的错误信息:
Modules/gcmodule.c:348: visit_decref: Assertion "gc->gc.gc_refs != 0" failed.
refcount was too small
object : <weakref at 0x9e0f194; to 'gevent.core.http_request' at 0x9e0a11c>
type : weakref
refcount: 1
address : 0x9e0f194
Aborted (core dumped)
我的系统配置是: CentOS 6.3, Python 2.6.6, Gevent 0.13.8
有没有人知道可能出什么问题了?看起来这些都是很基础的东西,怎么会导致这样的错误呢...
1 个回答
1
你可能需要把Gevent升级到1.0版本,因为在这个版本中修复了一些和垃圾回收有关的错误。
我还看到有人建议在接受请求之前稍微等待一下。