有一個想法,在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