我有一个在 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'
有人可以帮助我吗?
我想,你说的是/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'
在这里:
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
(,但是,你可能有理由这样做(遗留代码,等等......但是从芹菜任务开始线程,真的很???