计划任务执行中的芹菜错误

时间:2018-07-02 12:00:36

标签: python celery

我在Archlinux机器上有一个与Redis服务器一起运行的Celery实例。 在这种情况下,我定义了一些每X分钟执行一次的任务。日程安排正常(如果我检查日志,则正在调用任务),但是有一个任务输出错误。 任务是运行另一个python脚本。 如果我手动运行此脚本,它将运行完美。但是当芹菜尝试执行它时,我收到此错误:

WARNING/ForkPoolWorker-93] Exception in thread Thread-6:
Traceback (most recent call last):
  File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
TypeError: 'int' object is not callable

tasks.py是:

@periodic_task(
    run_every=(crontab(minute='*/15')),
    name="sm37_auto",
    ignore_result=True
)
def sm37_auto():
    comando_sm37 = os.system("python /home/user/sm37.py")
    background_thread=threading.Thread(target=comando_sm37)
    background_thread.start()
    return 'ejecuta SM37 ok'

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

我想,您在说的是/home/user/sm37.py,它非常有效。脚本task.py也可以很好地执行,因为它没有什么要执行的:语法上该函数是正确的。

问题是,当您启动线程时,需要以target的形式传递可执行文件,而传递的是返回值。考虑进行更改:

def sm37_thread():
    comando_sm37 = os.system("python /home/user/sm37.py")

def sm37_auto():
    background_thread=threading.Thread(target=sm37_thread)
    background_thread.start()
    return 'ejecuta SM37 ok'

答案 1 :(得分:0)

这里:

comando_sm37 = os.system("python /home/user/sm37.py")

这将执行/home/user/sm37.py脚本并返回进程退出状态,该状态为整数错误代码(其中0表示“没有错误”,而其他所有内容都是错误)。

然后您拥有:

background_thread=threading.Thread(
    target=comando_sm37
)

您尝试在其中创建线程的地方(为什么要在这种情况下创建线程超出了我的想象,但这是另一个主题),并传递一个整数作为目标可调用对象。

总而言之,这段代码毫无意义。

使用os.system执行Python脚本已经很成问题了(Python代码可以导入其他python代码,您不需要os.system),但是,您可能有这样做的理由(旧版代码,无论如何...)。但实际上是从芹菜任务开始线程?