加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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()并行化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读