关于redis+celery

2017-10-16  本文已影响0人  小神同学

有一个想法,在flask的web界面中编辑代码,然后传入参数,把这个task扔进celery中执行。
celery中动态import写好的模块,在client传进celery的broker时,带入模块名和路径(或者路径写死)以及其他参数。

task的代码:

# celery task的代码
from celery import Celery
import imp
import sys

app = Celery('tasks', broker='redis://192.168.99.100:32787/0', backend='redis://192.168.99.100:32787/1')

def load(module_name, module_path):
    fp, pathname, desctiption = imp.find_module(module_name, path=[module_path])
    try:
        return imp.load_module(module_name, fp, pathname, desctiption)
    finally:
        if fp:
            fp.close()


@app.task
def import_module(module_name, module_path):
    # return module_name
    if module_name not in sys.modules:
        do = load(module_name, module_path)
        a = 1
    else:
        do = sys.modules[module_name]
        a = 2
    return do.test(), a

##############################################################
#client的代码:
for i in range(10):
    result = import_module.delay('code', r"C:\Users\user\PycharmProjects\pandas_mongodb_test")
    result.ready()
    print(result.get())

测试成功!

然后发现一个有趣的玩意儿,在启动celery时,默认4个进程,然后收到4个任务以后,4个进程都会加载完module,当第五个任务进来时,4个进程因为都已经import完module了,所以可以直接从sys.modules中找到动态import的module

上一篇下一篇

猜你喜欢

热点阅读