我有三个服务器运行我的程序,每个服务器有八个芹菜工作者从redis获取任务。也就是说,每个服务器的芹菜任务都可以由另一台服务器执行。
在每台服务器中: 提交更改并致电任务
...
try:
db.session.commit()
except Exception as e:
current_app.logger.error(str(e))
db.session.rollback()
if not ci_existed: # only add
self.delete(ci.ci_id)
return abort(500, "add CI error")
his_manager = CIAttributeHistoryManger()
his_manager.add(ci.ci_id, histories)
ci_cache.apply_async([ci.ci_id], queue="async")
# add bj ci
add_ci_bj.apply_async([ci_type.type_name, None, ci.ci_id], queue="async")
return ci.ci_id
任务功能
@celery.task(name="xxxxxxx", queue="async")
def add_ci_bj(ci_type, first_id, second_id):
param, status = lib.ci.CIManager().get_relations(first_id, second_id, is_async=True)
...
任务中的功能
def get_relations(self, first_id, second_id, is_async=False):
start = time.clock()
try:
second = self.get_ci_by_id(second_id, need_children=False)
except Exception as e:
return None, "get ci by id error: first %s, second %s, e %s, is_async:%s" % \
(first_id, second_id, e, is_async)
...
我插入数据并提交到MySQL并调用任务add_ci_bj
,但我无法通过second_id
获取数据,我无法弄清楚,任何人都可以提供一些帮助?
答案 0 :(得分:0)
得到答案,在另一台服务器上调用之前关闭会话。如:
@celery.task(name="xxxxxxx", queue="async")
def add_ci_bj(ci_type, first_id, second_id):
db.session.Close()
param, status = lib.ci.CIManager().get_relations(first_id, second_id, is_async=True)
...