有没有人有使用eventlet.corolocal的经验,特别是使用芹菜(为工作人员使用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 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())。但是,事件小程序总是在不知道变量/ ev_local 'a‘的情况下找到attr。所以dummy_task(...)中的打印语句始终打印1。
有没有什么地方会出问题?
发布于 2015-08-09 23:24:08
这里有一个小的打字错误:if hasattr(ev_local, a):
hasattr的第二个参数必须是string:hasattr(ev_local, 'a')。
发布于 2016-12-07 04:50:58
Eventlet不能保证你会收到相同的greenthread。事实上,每个任务都可以在一个新的greenthread中运行。
绿色线程id (eventlet.corolocal.get_ident())是Python对象的内存地址(我认为是绿色线程)。因此,当使用新的greenthread执行celery任务时,线程本地存储将“消失”。如果幸运的是芹菜任务重用了绿线程,那么线程本地存储中的信息将重新出现。
您可以使用prefork线程模型来解决这个问题。
到目前为止,我还没有解决这个问题。
https://stackoverflow.com/questions/31707634
复制相似问题