`
san_yun
  • 浏览: 2639735 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

jython executor

 
阅读更多

jython executor

# -*- coding: utf-8 -*-
try:
    from webx import settings
except ImportError:
    import os,sys
    p = os.path.dirname(__file__)
    for x in xrange(5):
        p=os.path.split(p)[0]
    os.sys.path.append(p+'/src/main/webapp')
    
"""
由于需要依赖 java concurrent框架, 所以只能通过jython启动
"""

from java.util.concurrent import  ThreadFactory,Executors,ThreadPoolExecutor,TimeUnit,ArrayBlockingQueue
from java.lang import Thread,Runnable
from  java.util.concurrent.atomic import AtomicInteger

from task.index.solr import Solr      
from people.service import userQueryService
from blog.service import    blogQueryService
from tag.service import tagQueryService
from shopping.service import shoppingItemService


import logging
logger = logging.getLogger("opener")

'''
负责创建Solr Client
'''
class SolrFactory():
    
    def __init__(self,server,timeout):
        self.cores = ['people','feed','feed2','album']
        self.solrs = {}
        for  core in self.cores:
            logger.info("init solr client "+core)
            self.solrs[core] = Solr(server + core + "/", timeout)
    
    def get_solr(self,core):
            return self.solrs.get(core)

write = 'http://192.168.173.6:7100/solr/'
solrFactory = SolrFactory(write,20)

'''
为 Executors中的线程增加名字,便于jstack的时候查看Thread
参考:java concurrent包的  Executors.DefaultThreadFactory
'''
class NamedThreadFactory(ThreadFactory): 
    
    def __init__(self,prefix,daemo=False):
        self.mPrefix = prefix + "-thread-";
        self.mDaemo = daemo;
        self.mGroup = Thread.currentThread().getThreadGroup() 
        self.mThreadNum = AtomicInteger(1);
        
    def newThread(self, runnable):
        name = '%s%s ' %(self.mPrefix , self.mThreadNum.getAndIncrement())
        ret = Thread(self.mGroup, runnable, name, 0)
        ret.setDaemon(self.mDaemo)
        return ret;

rejectedExecutionHandler = ThreadPoolExecutor.CallerRunsPolicy()    #使用CallerRuns策略,变相的减缓新任务的提交速度
buildExecutor =  ThreadPoolExecutor(5,5, 0L, TimeUnit.MILLISECONDS,ArrayBlockingQueue(1000), NamedThreadFactory("build"),rejectedExecutionHandler ); 
commitExecutor =  ThreadPoolExecutor(5,5, 0L, TimeUnit.MILLISECONDS,ArrayBlockingQueue(1000), NamedThreadFactory("commit"),rejectedExecutionHandler );


'''
负责把模型build成solr document,分别有:
BlogBuilder
PeopleBuilder
SolrBuilder
'''                                                                      
class BaseBuilder(Runnable):
    
    def _solr_str(self,date):
        """1995-12-31T23:59:59Z"""
        return date.strftime("%Y-%m-%dT%H:%M:%SZ")
    
    def run(self):
            raise NotImplementedError
    
class  BlogBuilder(BaseBuilder):
    
    def __init__(self, ids,executor):
        self.ids = ids
        self.executor = executor
        self.solr = solrFactory.get_solr("feed") 
    
    def _extra_tags(self,blog):
        iphone_wall_paper = blog.photo_width>=320 and blog.photo_height>=480 and blog.photo_height/float(blog.photo_width) == 1.5 and "INNERTAGIPHWP" or ""
        iphone_wall_paper = blog.photo_width>=320 and blog.photo_height>=568 and blog.photo_height/float(blog.photo_width) == 1.775 and "INNERTAGIPHWP5" or iphone_wall_paper
        item_cat_id = ''
        item_cat_pid = ''
#        if blog.is_buyable():
#            item_id = shoppingItemService.find_item_id(blog)
#            item_cat = shoppingItemService.find_or_create_taobao_category(None,item_id)
#            if item_cat:
#                item_cat_id =  item_cat.get("cid") and 'ITEMCATID_%s'%item_cat.get("cid") 
#                item_cat_pid = item_cat.get("parent_id")  and 'ITEMCATPID_%s'%item_cat.get("parent_id")
#            else:
#                logger.error('Can not include taobao category info when indexing %s'%blog.id)
        return (iphone_wall_paper, item_cat_id, item_cat_pid)
            
    def run(self):
        #print 'build %s'%len(self.ids)
        blog_list = blogQueryService.queryBlogDetail(self.ids)
        doc = []
        for blog in blog_list:
            if not blog.is_normal():
                    continue
            if blog.is_in_audit():
                    continue
            blog_tags = tagQueryService.queryTagStrByBlogId(blog.id)
            extra_tags =  self._extra_tags(blog) #这里可以扩展内部的其他各种查询条件, 比增加字段靠谱, 性能更好, 更灵活
            data =  {"id": blog.id,
                "sender_id": blog.sender_id,
                "msg": blog.msg or "" +" " +"".join(blog_tags)+" " +"".join(extra_tags),
                "buyable": blog.buyable,
                "add_datetime": self._solr_str(blog.add_datetime),
                "last_replied_datetime":self._solr_str(blog.last_replied_datetime),
                "photo_id":blog.photo_id,
                "photo_width": blog.photo_width,
                "photo_height": blog.photo_height,
                "favorite_count":blog.favorite_count,
                "category":blog.category,
                "status":blog.status,
                "group_id": blog.group_id,
                "album_id":blog.album_id,
                "pop_score":1, #已经废弃
                "shopping_score":1,#已经废弃
                "src_domain":blog.source_link,
                "price":blog.price,
            }
            doc.append(data)
        self.executor.execute(Commiter(doc,self.solr)) #提交task

class Commiter(Runnable):

    def __init__(self,doc,solr):
        self.doc = doc
        self.solr = solr
        
    def run(self):
        #print 'commit %s'%len(self.doc)
        if self.doc:
            try:
                self.solr.add_many(self.doc)
                self.solr.commit()
            except Exception,e:
                logger.exception(e) 

if __name__ == "__main__":
    buildExecutor.execute(BlogBuilder([1,2,3,4,5,6,7,8,9,10,11],commitExecutor))
    import time
    while True:
        time.sleep(2)

 

分享到:
评论

相关推荐

    jython各个版本下载地址

    ### Jython 各个版本下载地址解析 Jython 是一种Python的实现,它允许Python代码在Java平台上运行。本文将详细介绍Jython不同版本的下载地址及相关文件信息。 #### Jython 2.2 版本 - **发布日期**:2007年8月24...

    jython-standalone-2.7.0.zip

    标题 "jython-standalone-2.7.0.zip" 提供了我们正在处理的是一个Jython的独立版本,具体是2.7.0的发行版。Jython是一种Python的实现,它允许Python代码在Java平台上运行。这个压缩包很可能包含了一个完整的Jython...

    Burpsuite环境Jython安装方法1

    **Burp Suite 环境 Jython 安装详解** Burp Suite 是一款广泛使用的网络安全测试工具,主要用于 web 应用程序的安全性测试。而 Jython 是 Python 语言的一个实现,它运行在 Java 虚拟机(JVM)上,使得 Python 代码...

    jython中文详细教程

    **Jython 中文详细教程** Jython是一种基于Python语言的解释器,它是针对Java平台设计的,能够直接运行在Java虚拟机(JVM)上。它不仅提供了Python的全部功能,还能够无缝集成Java类库,使得开发者可以利用Python的...

    Jython简单配置和使用

    Jython 简单配置和使用 Jython 是一种完整的语言,而不是一个 Java 翻译器或仅仅是一个 Python 编译器,它是一个 Python 语言在 Java 中的完全实现。Jython 也有很多从 CPython 中继承的模块库。最有趣的事情是 ...

    jython-standalone-2.7.0.jar

    《Java调用Python脚本:Jython详解及应用》 在现代软件开发中,常常需要在不同的编程语言之间进行交互,比如Java与Python。Jython是这样一种工具,它允许Java开发者无缝地运行Python代码,使得Java应用可以利用...

    Jython示例

    **Jython概述** Jython是一种基于Java平台的Python实现,它允许Python代码与Java平台无缝集成。Jython的出现使得Python开发者能够利用Java的强大功能,同时保持Python的简洁性和易读性。它不仅实现了Python标准库,...

    jython安装和使用方法

    Jython 安装和使用方法 Jython 是一个基于 Java 语言的 Python 实现,它可以让 Python 语言运行在 Java 平台上。下面将详细介绍 Jython 的安装和使用方法。 安装 Jython 首先,需要从 Jython 官方网站下载 Jython...

    jython-standalone-2.7.0(最新版本)

    如果windows的用户安装插件有问题的,尝试一下换这个jython: Jython官网: https://www.jython.org/downloads.html Jython环境安装包: ...

    Jython教程

    **Jython教程** Jython是一种基于Python编程语言的开源实现,它完全兼容Python语法,并且在Java平台上运行。由IBM developerworks提供的Jython教程旨在帮助开发者理解和掌握如何在Java环境中利用Jython进行开发。 ...

    jython2.5-安装包

    Jython是一种Python编程语言的实现,它允许开发者在Java平台上编写和运行Python代码。这个"jython2.5-安装包"显然包含了Jython 2.5版本的安装程序,这是一个较旧但仍然有其用途的版本。Jython 2.5b1是该系列的beta1...

    jython官方jython-standalone-2.7.1b1版本(版本全)

    jython官方正版资源 为了省去大家找Jython安装包的时间,附上此Jython版本。 Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。

    jython官方jython-standalone-2.7.1b2版本(版本全)

    jython官方正版资源 为了省去大家找Jython安装包的时间,附上此Jython版本。 Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。

    jython-standalone-2.7.1 burpsuite的python环境配置

    标题"jython-standalone-2.7.1 burpsuite的python环境配置"指的是使用Jython(一个Python的Java实现)的独立版本2.7.1来配置Burp Suite(一个流行的网络安全测试工具)的Python环境。Burp Suite允许用户通过编写...

    jython简易教程

    **Jython简易教程** Jython,一种Python的实现,是Python语言与Java平台的结合体。它允许开发者利用Python的简洁语法和丰富的库,同时享受到Java的高性能和跨平台优势。Jython运行在Java虚拟机(JVM)上,使得...

    jython的用法及学习文档

    ### Jython的用法及学习文档 #### 一、引言 Jython 是一种能够运行在 Java 平台上的 Python 解释器,它允许开发者直接使用 Python 代码调用 Java API,同时也支持 Java 代码调用 Python 的功能。本文档旨在帮助...

    jython学习文档

    这份文档主要介绍了两个核心概念:一个是可以与Jython对象映射的Java接口类,以及一个用于从Jython文件中获取Java对象、Jython对象和Jython函数对象的工厂方法类。 ### Jython与Java接口的映射 首先,我们关注到的...

    jython

    标题 "Jython" 提到的是一个与Python编程语言相关的开源项目——Jython。Jython是Python的一个实现,它允许Python代码在Java平台上运行。Jython将Python语言的灵活性和简洁性与Java平台的强大功能相结合,使得开发者...

    jython-standalone-2.7.1.jar

    《Jython:Java与Python的桥梁》 Jython,这个名字源于Java和Python的结合,是一种Python的实现,它允许在Java平台上运行Python代码。标题中的"jython-standalone-2.7.1.jar"是一个独立的Jython版本,特别适用于...

Global site tag (gtag.js) - Google Analytics