首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对芹菜使用eventlet.corolocal

对芹菜使用eventlet.corolocal
EN

Stack Overflow用户
提问于 2015-07-30 01:49:20
回答 2查看 573关注 0票数 3

有没有人有使用eventlet.corolocal的经验,特别是使用芹菜(为工作人员使用eventlets )?

如果是这样的话,你能解释一下下面的代码示例有什么问题吗?

代码语言:javascript
运行
复制
...
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()

如果我现在使用并发性启动一个芹菜工作进程,

代码语言:javascript
运行
复制
celery multi start 1 -A process_mss -l info -P eventlet -c 5 --verbose

并调用任务(dummy_task) 20次-

代码语言:javascript
运行
复制
...

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

我看到这5个eventlet分别处理4个任务(使用id返回的eventlet.corolocal.get_ident())。但是,事件小程序总是在不知道变量/ ev_local 'a‘的情况下找到attr。所以dummy_task(...)中的打印语句始终打印1。

有没有什么地方会出问题?

EN

回答 2

Stack Overflow用户

发布于 2015-08-09 23:24:08

这里有一个小的打字错误:if hasattr(ev_local, a):

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

票数 0
EN

Stack Overflow用户

发布于 2016-12-07 04:50:58

Eventlet不能保证你会收到相同的greenthread。事实上,每个任务都可以在一个新的greenthread中运行。

绿色线程id (eventlet.corolocal.get_ident())是Python对象的内存地址(我认为是绿色线程)。因此,当使用新的greenthread执行celery任务时,线程本地存储将“消失”。如果幸运的是芹菜任务重用了绿线程,那么线程本地存储中的信息将重新出现。

您可以使用prefork线程模型来解决这个问题。

到目前为止,我还没有解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31707634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档