Python 如何检测I';我在做芹菜工人?
是否有一种方法可以通过编程确定当前导入/运行的模块是在芹菜工人的上下文中完成的Python 如何检测I';我在做芹菜工人?,python,celery,Python,Celery,是否有一种方法可以通过编程确定当前导入/运行的模块是在芹菜工人的上下文中完成的 我们已经决定在运行芹菜工人之前设置一个环境变量,并在代码中检查这个环境变量,但我想知道是否有更好的方法?添加一个环境变量是检查模块是否由芹菜工人运行的好方法。在任务提交者流程中,我们可以设置环境变量,以标记它未在芹菜工作者的上下文中运行 但更好的方法可能是使用一些芹菜信号,这可能有助于了解模块是否在worker或task submitter中运行。例如,信号被发送到每个子任务执行器进程(在预工作模式下),处理程序可用
我们已经决定在运行芹菜工人之前设置一个环境变量,并在代码中检查这个环境变量,但我想知道是否有更好的方法?添加一个环境变量是检查模块是否由芹菜工人运行的好方法。在任务提交者流程中,我们可以设置环境变量,以标记它未在芹菜工作者的上下文中运行
但更好的方法可能是使用一些芹菜信号,这可能有助于了解模块是否在worker或task submitter中运行。例如,信号被发送到每个子任务执行器进程(在预工作模式下),处理程序可用于设置一些全局变量,指示它是工作进程 根据您的用例场景,您可以通过检查是否设置了请求id来检测它:
@app.task(bind=True)
def foo(self):
print self.request.id
如果您以
foo.delay()
的形式调用上述命令,则任务将被发送给工作人员,self.request.id
将被设置为唯一的数字。如果您以foo()
的形式调用它,那么它将在当前流程中执行,self.request.id
将为None
使用名称启动工人是一种很好的做法,这样可以更容易地管理(停止/杀死/重新启动)他们。您可以使用-n
来命名工作人员
celery worker -l info -A test -n foo
现在,在您的脚本中,您可以使用app.control.inspect
查看该工作程序是否正在运行
In [22]: import test
In [23]: i = test.app.control.inspect(['foo'])
In [24]: i.app.control.ping()
Out[24]: [{'celery@foo': {'ok': 'pong'}}]
您可以阅读更多您可以使用
芹菜
应用程序实例类中的当前工作者任务
属性
定义了以下任务:
# whatever_app/tasks.py
celery_app = Celery(app)
@celery_app.task
def test_task():
if celery_app.current_worker_task:
return 'running in a celery worker'
return 'just running'
可以在python shell上运行以下操作:
In [1]: from whatever_app.tasks import test_task
In [2]: test_task()
Out[2]: 'just running'
In [3]: r = test_task.delay()
In [4]: r.result
Out[4]: u'running in a celery worker'
注意:显然,要想成功测试任务。延迟(),您需要至少有一个芹菜工人运行并配置为从任何应用程序任务加载任务
import sys
IN_CELERY_WORKER_PROCESS = sys.argv and sys.argv[0].endswith('celery')\
and 'worker' in sys.argv
if IN_CELERY_WORKER_PROCESS:
print ('Im in Celery worker')
从芹菜4.2开始,您也可以通过在worker\u ready
信号上设置一个标志来实现这一点
在芹菜.py中
:
from celery.signals import worker_ready
app = Celery(...)
app.running = False
@worker_ready.connect
def set_running(*args, **kwargs):
app.running = True
现在,您可以使用全局应用程序实例在任务中进行检查
看看你是否在跑步。这对于确定要使用哪个记录器非常有用。
Cellery.current_app
可能吗?现在我使用的是相同的解决方案,类似于sys.argv中的'worker'if'worker',但我担心如果另一个人导入了我的项目,并且在他的芹菜项目中也使用了参数'worker'。不幸的是,我需要知道我是否工作得更早(当我导入任务时…)。因此,envvar是我前进的唯一途径……如果芹菜正在一个工人身上执行另一个任务,而这个任务正在脱机执行,这难道不会产生误报吗?