美文网首页
关于redis+celery

关于redis+celery

作者: 小神同学 | 来源:发表于2017-10-16 17:57 被阅读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

    相关文章

      网友评论

          本文标题:关于redis+celery

          本文链接:https://www.haomeiwen.com/subject/mxlluxtx.html