首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回调中出现Tornado IOLoop异常无芹菜工作线程

回调中出现Tornado IOLoop异常无芹菜工作线程
EN

Stack Overflow用户
提问于 2014-10-03 15:10:27
回答 2查看 2.3K关注 0票数 1

我在celery worker中使用tornado.ioloop,因为我需要使用mongodb。

代码语言:javascript
复制
class WorkerBase():
    @gen.engine
    def foo(self,args,callback)
        bar = ['Python','Celery','Javascript','HTML']

        # ... process something ....

        callback(bar)

    @gen.engine
    def RunMyTask(self,args):

        result = yield gen.Task(self.foo,args=args)
        # Stop IOLoop instance
        IOLoop.instance().stop()


@task(name="MyWorker",base=WorkerBase)
def CeleryWorker(args):
    # This works because i'm adding base as WorkerBase
    CeleryWorker.RunMyTask(args)
    IOLoop.instance().start()
    return True

当我调用一个任务时,它给出一个错误,说:

代码语言:javascript
复制
[2014-10-02 12:12:11,561: ERROR/Worker-4] Exception in callback None
Traceback (most recent call last):
    File "/var/www/myapp/env/local/lib/python2.7/site-packages/tornado/ioloop.py", line 832, in start
fd_obj, handler_func = self._handlers[fd]
KeyError: 16

代码语言:javascript
复制
[2014-10-02 12:12:11,561: ERROR/Worker-4] Exception in callback None
Traceback (most recent call last):
    File "/var/www/myapp/env/local/lib/python2.7/site-packages/tornado/ioloop.py", line 832, in start
fd_obj, handler_func = self._handlers[fd]
KeyError: 14

这些错误是不一致的。是否有提升条件?

EN

回答 2

Stack Overflow用户

发布于 2014-10-03 21:03:59

这看起来像是线程问题。我不熟悉celery的线程模型,但它看起来像是启动了多个CeleryWorker副本,每个副本都试图运行相同的单例IOLoop.instance()。如果您要像这样运行每个工作线程,那么每个工作线程都需要自己的IOLoop -看看同步tornado.httpclient.HTTPClient如何创建和运行临时IOLoop

票数 1
EN

Stack Overflow用户

发布于 2014-10-10 13:27:42

看起来你的工作任务在ioloop停止之前刚刚返回并被视为已完成,所以我猜gen.engine的回调无法找到原始的stack_context。

@task(name="MyWorker",base=WorkerBase) def CeleryWorker(args):#这是可行的,因为我添加了WorkerBase CeleryWorker.RunMyTask(args) IOLoop.instance().start() return True

我有一些建议给你

1)删除返回

代码语言:javascript
复制
@task(name="MyWorker",base=WorkerBase)
def CeleryWorker(args):
    # This works because i'm adding base as WorkerBase
    CeleryWorker.RunMyTask(args)
    IOLoop.instance().start()

2)使用run_sync

代码语言:javascript
复制
import functools

@task(name="MyWorker",base=WorkerBase)
def CeleryWorker(args):
    # This works because i'm adding base as WorkerBase
    func = functools.partial(CeleryWorker.RunMyTask, args)
    IOLoop.instance().run_sync(func)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26174676

复制
相关文章

相似问题

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