首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扭曲反应器在芹菜内不正常运行

扭曲反应器在芹菜内不正常运行
EN

Stack Overflow用户
提问于 2020-04-09 07:40:00
回答 1查看 422关注 0票数 2

系统/依赖关系详细信息:

代码语言:javascript
复制
CPU --> 4
requirements --> celery==4.3.0, twisted==19.7.0 , python3.7 

下面是我的芹菜配置

代码语言:javascript
复制
from threading import Thread
from celery import Celery
from twisted.internet import threads, reactor, defer
from twisted.web.error import Error
from celery import signals

app =   Celery('tasks', broker='pyamqp://guest@localhost//')

@signals.worker_process_init.connect
def configure_infrastructure(**kwargs):
    Thread(target=reactor.run, name="reactor.run", args=(False,)).start()
    print('started new thread')

@signals.worker_process_shutdown.connect()
def shutdown_reactor(**kwargs):
    """
    This is invoked when the individual workers shut down. It just stops the twisted reactor
    @param kwargs:
    @return:
    """
    reactor.callFromThread(reactor.stop)
    print('REACTOR SHUTDOWN')

def getPage(inp):
    print(inp)
    return inp

def inThread():
    print('inside inthread method')
    try:
        result = threads.blockingCallFromThread(
            reactor, getPage, "http://twistedmatrix.com/")
    except Exception as exc:
        print(exc)
    else:
        print(result)


@app.task
def add(x, y):
    print('inside add method')
    inThread()
    return x + y

运行芹菜工人如下所示:

代码语言:javascript
复制
celery -A run worker --loglevel=info

在芹菜开始时记录:

代码语言:javascript
复制
(2_env) ubuntu@gpy:~/app/env/src$ celery -A run worker --loglevel=info

[tasks]
  . run.add

[2020-04-09 07:25:29,357: WARNING/Worker-1] started new thread
[2020-04-09 07:25:29,362: WARNING/Worker-4] started new thread
[2020-04-09 07:25:29,362: WARNING/Worker-3] started new thread
[2020-04-09 07:25:29,364: WARNING/Worker-2] started new thread
[2020-04-09 07:25:29,367: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//

调用方法如下所示:

代码语言:javascript
复制
>>> run.add.delay(1,2)
<AsyncResult: d41680fd-7cc1-4e75-81be-6496bad0cc16>
>>> 

有时我能看出它工作得很好。

代码语言:javascript
复制
[2020-04-09 07:27:17,998: INFO/MainProcess] Received task: run.add[00934769-48c4-48b8-852c-8b746bdd5e03]
[2020-04-09 07:27:17,999: WARNING/Worker-4] inside add method
[2020-04-09 07:27:17,999: WARNING/Worker-4] inside inthread method
[2020-04-09 07:27:18,000: WARNING/Worker-4] http://twistedmatrix.com/
[2020-04-09 07:27:18,000: WARNING/Worker-4] http://twistedmatrix.com/
[2020-04-09 07:27:18,000: INFO/MainProcess] Task run.add[00934769-48c4-48b8-852c-8b746bdd5e03] succeeded in 0.00144551398989s: 3

有时我可以看到它无法调用getPage 方法,并且像在日志下面挂起

代码语言:javascript
复制
[2020-04-09 07:27:22,318: INFO/MainProcess] Received task: run.add[d41680fd-7cc1-4e75-81be-6496bad0cc16]
[2020-04-09 07:27:22,319: WARNING/Worker-2] inside add method
[2020-04-09 07:27:22,319: WARNING/Worker-2] inside inthread method

reactor.run内部使用Thread有什么问题吗?

更新

我把打印放进*twisted.internet.threads.blockingCallFromThread*里。

代码语言:javascript
复制
def blockingCallFromThread(reactor, f, *a, **kw):
    queue = Queue.Queue()
    def _callFromThread():
        print('inside _callFromThread')
        result = defer.maybeDeferred(f, *a, **kw)
        result.addBoth(queue.put)
    print('before calling _callFromThread')
    reactor.callFromThread(_callFromThread)
    print('after calling _callFromThread')
    result = queue.get()
    if isinstance(result, failure.Failure):
        result.raiseException()
    return result

我可以看到,只有当_callFromThread方法在reactor.callFromThread(_callFromThread)中没有被调用时,芹菜工人才会被挂起,但是当我用CTRL + c手动停止该工人时,它才能被调用。

每当我停止工作挂起的工人,它就开始处理工作。

更新:2020年4月27日

如果我用钩针操作扭曲的反应堆就解决了。我更新以下功能。

代码语言:javascript
复制
@signals.worker_process_init.connect
def configure_infrastructure(**kwargs):
    from crochet import setup
    setup()
    print('started new thread')
EN

回答 1

Stack Overflow用户

发布于 2020-04-09 22:24:37

小心点,你似乎已经采取了,你可以运行扭曲反应堆在一个线程。但是,您将不能在多个线程中运行它,我想这就是当您在芹菜中使用它时所发生的事情。它具有实例和全局状态,如果它在多个线程中运行,它将被踩在上面。

相反,尝试使用钩针来协调对运行在单个非主线程中的反应堆的调用,这些调用来自任意多个其他线程。

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

https://stackoverflow.com/questions/61116175

复制
相关文章

相似问题

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