php – 实现频繁调用Python脚本的最佳方法
发布时间:2020-12-13 16:17:35 所属栏目:PHP教程 来源:网络整理
导读:我正在研究一些使用mechanize从另一个网站获取数据的 python代码.由于网站的复杂性,代码需要10-30秒才能完成.它必须通过几页等工作. 我计划相当频繁地调用这段代码.我想知道实现这样的事情的最佳方法,而不会造成巨大的服务器负载.因为我对python很新,所以我
我正在研究一些使用mechanize从另一个网站获取数据的
python代码.由于网站的复杂性,代码需要10-30秒才能完成.它必须通过几页等工作.
我计划相当频繁地调用这段代码.我想知道实现这样的事情的最佳方法,而不会造成巨大的服务器负载.因为我对python很新,所以我不确定该语言的工作原理. 如果代码正在处理一个请求而另一个用户调用代码,那么代码的两个实例可以一次运行吗?有没有更好的方法来实现这样的东西? 我希望以一种能够完成大量任务的方式进行设计,而不会对服务器造成太大的负担. 解决方法
我的数据抓取脚本都使用缓存来最小化服务器上??的负载.请务必使用HTTP工具,例如“If-Modified-Since”,“If-None-Match”和“Accept-Encoding:gzip”.
还要考虑使用多处理模块,以便您可以并行运行请求. 以下是我的下载脚本的摘录: def urlretrieve(url,filename,cache,lock=threading.Lock()): 'Read contents of an open url,use etags and decompress if needed' request = urllib2.Request(url) request.add_header('Accept-Encoding','gzip') with lock: if ('etag ' + url) in cache: request.add_header('If-None-Match',cache['etag ' + url]) if ('date ' + url) in cache: request.add_header('If-Modified-Since',cache['date ' + url]) try: u = urllib2.urlopen(request) except urllib2.HTTPError as e: return Response(e.code,e.msg,False,False) content = u.read() u.close() compressed = u.info().getheader('Content-Encoding') == 'gzip' if compressed: content = gzip.GzipFile(fileobj=StringIO.StringIO(content),mode='rb').read() written = writefile(filename,content) with lock: etag = u.info().getheader('Etag') if etag: cache['etag ' + url] = etag timestamp = u.info().getheader('Date') if timestamp: cache['date ' + url] = timestamp return Response(u.code,u.msg,compressed,written) 缓存是shelve的实例,是持久字典. 调用下载程序与多处理池实例上的imap_unordered()并行化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |