【发布时间】:2014-09-01 11:44:16
【问题描述】:
我正在尝试使用 Django 将 python 脚本作为芹菜任务运行。我遇到的问题是,一旦脚本开始运行,任务就认为它已经完成。我最初在 tasks.py 文件中使用 subprocess.popen(),但意识到这意味着一旦发出 popen() 命令,任务就会完成。我修改了我的 tasks.py 代码以调用我的 python 脚本中的一个函数,该函数运行该脚本;但是,这仍然会像任务立即完成一样执行。我很困惑,因为在花中它说任务已完成,但在芹菜日志中它正在输出我正在运行的脚本中定义的日志数据。我找到了以下related post。我相信我正在遵循它的建议,从 tasks.py 执行 python 函数。
tasks.py:
def exe(workDir, cancelRun):
sys.path.append(workDir)
import run
if cancelRun=='True':
task_id=exe.request.id
revoke(task_id,terminate=True)
else:
run.runModel(workDir)
task_id=exe.request.id
return task_id
runModel功能代码:
def runModel(scendir):
fullpath=scendir+'/run.py'
os.chdir(scendir)
p=Process(target=myMain,args=(scendir,))
p.start()
p.join()
【问题讨论】:
-
如果您在终端上运行命令(由您的任务执行的命令)会发生什么?如果它立即返回,则可能是它自己在守护进程,比如说通过 fork()。另一种测试原因的方法是使用 Django shell:python manage.py shell,然后执行必要的导入并手动调用您的函数。
-
从命令行执行符合我的预期。它开始运行一个脚本,这通常需要几个小时才能完成。我还认为我的 html 逻辑可能是错误的,我在任务错误完成后返回了我想要的页面。
-
我的问题实际上是我不了解 celery 的输出。我在看花的“工人”标签,而不是“任务”。我还将从日志文件开头开始的 celery 日志记录解释为它再次开始该过程的标志。事实证明它正在创建第二个任务(如预期和期望的那样)。最好在命令提示符下验证一切正常。
-
太棒了!将我的评论作为实际答案发布。
标签: celery django-celery celery-task