芹菜作为网络发布/子事件

时间:2015-06-26 01:39:11

标签: python celery publish-subscribe

我想建立一个网络发布/子事件系统,但也需要能够异步运行任务。我已经尝试过让芹菜做繁重的工作,但我觉得我正在试图填充一大堆东西才能​​让它发挥作用。

我有两台机器(输入和输出),它们都可以访问RabbitMQ。我想让一个主程序启动一个等待输入的循环(由网络摄像头检测到的移动)。我设置了input_machine启动main.py,它启动一个芹菜任务,该任务由input_machine子工作站上的工作人员监视到“输入”队列。这个任务只运行一次True循环,直到检测到一些输入,然后它调用另一个名为('project.entered_room',什么都不做)芹菜任务到“输出”队列。

同时在output_machine上,我有一个芹菜实例正在观察“输出”队列,其中一个名为('project.entered_room'的任务响应进入房间的人)。

因此,当在input_machine上检测到输入时,任务在输出机器上运行。我可以让这个工作,但遇到很多导入问题和其他令人头疼的问题。有没有更简单的方法来实现这一目标?我错了吗?我使用的是错误的工具吗?

我已经研究了许多不同的框架,包括电路和扭曲。扭曲是非常复杂的,我觉得我会用手提钻击打钉子。

2 个答案:

答案 0 :(得分:0)

芹菜只是一个任务经理。

RabbitMQ是您的消息代理。 我会在你的两台机器之间实现一个RabbitMQ通道,并使用发布/订阅来管理你的输入。

也许这link可以帮助你

答案 1 :(得分:0)

我建议跳过Celery,直接使用Redis及其发布/订阅功能。例如,您可以通过运行Docker image来启动Redis。然后,在输入机上,当检测到某些内容时,将消息发布到通道。在输出计算机上,您订阅该频道并对事件进行操作。

例如,您的输入机可以使用以下内容:

import redis

def publish(message):
    r = redis.Redis(host="redis")
    r.publish("test-channel", message)

然后在输出端:

import time
import redis

def main():
    r = redis.Redis(host="redis", decode_responses=True)
    p = r.pubsub(ignore_subscribe_messages=True)
    p.subscribe("test-channel")

    while True:
        message = p.get_message()
        if message:
            print(message.get("data", ""))
            # Do more things...
        time.sleep(0.001)

通过这种方式,您可以在输入和输出计算机之间发送纯文本或JSON数据。

在此处找到示例实现:https://github.com/moritz-biersack/simple-async-pub-sub