celery - 将 eventlet.corolocal 与 Celery 一起使用

标签 celery thread-local-storage eventlet

有没有人有使用 eventlet.corolocal 的经验,尤其是 celery(为 worker 提供 eventlets)?

如果是这样,您能否阐明以下代码示例的问题所在?

...
from eventlet.corolocal import local

...

ev_local = local()

@app.task
def dummy_task(self, a):
  if hasattr(ev_local, a):
    ev_local.a += a
  else:
    ev_local.a = a
  print ev_local.a

if __name__ == '__main__':
  app.start()

如果我现在启动一个具有并发性的 celery worker,比如 5,

celery multi start 1 -A process_mss -l info -P eventlet -c 5 --verbose

并调用任务 (dummy_task) 20 次 -

...

for i in xrange(20):
  dummy_task.delay(1)

我看到 5 个 eventlet 每个处理 4 个任务(使用 id 返回的 eventlet.corolocal.get_ident())。但是,eventlet 总是在不知道变量/属性“a”的情况下找到 ev_local。所以 dummy_task(...) 中的打印语句总是打印 1。

有什么可能出错的提示吗?

最佳答案

这里有个小错别字: 如果 hasattr(ev_local, a):

hasattr 的第二个参数必须是字符串:hasattr(ev_local, 'a')

关于celery - 将 eventlet.corolocal 与 Celery 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707634/

相关文章:

python - Django Celery 收到类型为 'appname.tasks.add' 的未注册任务

python - 如何在 celery 中将任务从一个队列移动到另一个队列

python - Celery 不使用 Redis 在 Kubernetes 中处理任务

javascript - 无法初始化并发 websocket 连接 [eventlet、Flask、javascript]

Python 消耗 99% 的 CPU 运行 eventlet

Celery 任务永久启动(不重试)

java - tomcat的ThreadLocalLeakPreventionListener到底是做什么的?

.net - 使用 .NET ThreadPool 线程时使用 CallContext.Logical[set/get]Data 是否安全?

android - 带有 pthread 析构函数的 c++ thread_local 析构函数

python - Eventlet 或 gevent 或 Stackless + Twisted、Pylons、Django 和 SQL Alchemy