Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检测I';我在做芹菜工人?_Python_Celery - Fatal编程技术网

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是我前进的唯一途径……如果芹菜正在一个工人身上执行另一个任务,而这个任务正在脱机执行,这难道不会产生误报吗?