关于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