MOMOJI.故事接龙·让我们一起讲故事,做个有故事的人

momoji.技术架构及算法

~pyramid_celery配置~
{ 任一段落可 [ 切到该章节 ] 进行续写接龙 }

~momoji.技术架构及算法~

选取python3为开发语言,版本python 3.7.3;

web架构为pyramid;

数据库访问采用sqlalchemy;

使用jinja2模板,也提供api,但非完全前后端分离;

前端使用了echarts2;

考虑该站点依靠iis挂了几个应用,80端口已占就用iis做了application request routing 和 url rewrite,后续考虑换为nginx;

数据库mysql,版本mysql 8.0.16.0;后续考虑换位文件系统;

存储结构具有为单父属性的节点,即tree或者multi-tree;但最终实现可成环的有向图,非dag(因为有向且成环);

momoji.技术架构及算法 by 飞~甜 @ 2019-06-11 14:56:51

切到该章 收藏 从此续写

~celery~

前几天学习了python celery,python的分布式任务队列;今天给momoji添加了pyramid_celery模块;

谈几点感受吧:

1.celery传承python清新简洁的风格,对函数定义进行修饰,即完成了队列的publisher的提交定义,同时也完成了任务队列的consumer的任务处理逻辑定义;

例如:

tasks.py

from pyramid_celery import celery_app as app

@app.task

def add(x, y):

    return x+y

以上即定义了任务的publisher的提交形式:名称为add;需要两个参数x和y;又定义了consumer的处理逻辑:计算x与y的和;



2.调用publisher和启动consumer也自然而然的统一起来;

例如:

celery worker -A tasks --pool=solo -l info

此系统命令启动了一个任务的consumer,对应的逻辑定义在tasks.py中;

>>>from tasks import add

>>>r = add.delay(3,4)

>>>r.result

7

此python语句引入了tasks模块中的add,对add进行add.delay(3,4)调用,即完成了对task的publish;



celery by 飞~甜 @ 2019-07-02 18:25:55

切到该章 收藏 从此续写

~pyramid_celery配置~

在体验celery时,使用的是在celeryconfig.py中配置celery参数:

app.config_from_object('celeryconfig')

在celeryconfig.py中可以配置:

CELERY_IMPORTS = (

    'tasks'

)

'''

CELERY_TRACK_STARTED = True

CELERYD_CONCURRENCY = 4 # 配置会启用执行任务的线程数

CELERYD_PREFETCH_MULTIPLIER = 1 # how many messages a time

CELERY_TASK_RESULT_EXPIRES = 60

CELERYD_HIJACK_ROOT_LOGGER = False

CELERY_DEFAULT_QUEUE = 'DEFAULT_QUEUE'

# 只要配置好路由器和队列,使得celery能够接收到消息,其会根据方法签名自行选择方法进行执行

#定义queue

CELERY_QUEUES = (

    Queue('momoji_celery_work_queue_test_add', Exchange('momoji_celery_exchange', type='topic'), routing_key='key.add'), 

    Queue('momoji_celery_work_queue_test_multi', Exchange('momoji_celery_exchange', type='topic'), routing_key='key.multi'), 

)

#定义routes用来决定不同的任务去哪一个queue 和 那个队列对应的是那个处理task函数

CELERY_ROUTES = {

    'momoji.celerytask.add': {'queue': 'momoji_celery_work_queue_test_add', 'routing_key': 'key.add'},

    'momoji.celerytask.multi': {'queue': 'momoji_celery_work_queue_test_multi', 'routing_key': 'key.multi'},

}

在pyramid_celery架构中,它采用了在ini文件中进行配置:

以上的配置项有些是不能在ini形式下使用的,有些需要换一种形式,有些需要采用此架构的特殊定义:

1.不能使用的(至少我没找到可用的形式,没有试验成功):

CELERY_QUEUES --这个很可惜,celery可以直接据此配置在mq里建立exchange/queue和binding关系,在pyramid_celery中我手动建立的这些mq对象和关系;

2.需换形式的:

比如在celery中可以使用python的数组形式赋值:

CELERY_ACCEPT_CONTENT = ['json','pickle']

在pyramid中需要符合ini文件的规范,采用如下形式:

CELERY_ACCEPT_CONTENT = json

pickle

另ini中的字符值不要加''或""

3.需要特殊定义的:

在celery中可以如此定义route

CELERY_ROUTES = {

    'momoji.celerytask.add': {'queue': 'momoji_celery_work_queue_test_add', 'routing_key': 'key.add'},

    'momoji.celerytask.multi': {'queue': 'momoji_celery_work_queue_test_multi', 'routing_key': 'key.multi'},

}

在pyramid_celery中需要:

[celeryroute:momoji.celerytask.add]

queue = momoji_celery_work_queue_test_add

routing_key = key.add

pyramid_celery配置 by 飞~甜 @ 2019-07-02 18:48:59

切到该章 收藏 从此续写

last by 飞~甜 @ 2019-07-02 18:48:59

章节模式 复制地址