这几天媳妇回娘家了,自己和同学熬夜打了几次dota,感觉自己直接傻X了。流鼻涕、眼睛干涩流眼泪,网上说这是过敏性鼻炎的问题,~~~(>_<)~~~。身体是革命的本钱啊,还是要早睡早起。。。
我们的爬虫服务器是 twisted + mongo 实现的,之前用的是pymongo,这是同步的,当数据量大的时候,耗时的请求会阻塞其他的请求,这是不能忍的。在组会上我同事介绍了 txmongo ,我决定实验一下。下面是我跑通的demo。
实验过程
使用 twisted xmlrpc 实现 server 端, 使用 xmlrpc 调用 server 端的函数。
实验代码
server代码
#coding:utf8
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import defer,reactor
import txmongo
from twisted.web import xmlrpc
class CrawlerServer(xmlrpc.XMLRPC):
allowNone = True
def __init__(self):
xmlrpc.XMLRPC.__init__(self)
mongo = txmongo.MongoConnection()
foo = mongo.foo # `foo` database
self.test = foo.test # `test` collection
@defer.inlineCallbacks
def xmlrpc_insert(self,doc):
result = yield self.test.insert(doc, safe=True)
defer.returnValue(repr(result))
@defer.inlineCallbacks
def xmlrpc_find(self,spec,limit=10):
result = yield self.test.find(spec, limit=limit)
defer.returnValue(repr(result))
if __name__ == '__main__':
root = Resource()
root.putChild("xmlrpc", CrawlerServer())
factory = Site(root)
reactor.listenTCP(8888, factory)
reactor.run()
client代码
import xmlrpclib
srv = xmlrpclib.Server("http://localhost:8888/xmlrpc",allow_none=True)
print "insert:", srv.insert({"name":"foobar","useDateTime":1})
print "find:", srv.find({"name":"foobar","useDateTime":1})
运行代码
server
python txmongo_server.py
client
python txmongo_client.py
结果:
运行结果.png
网友评论