我尝试从我的Falcon API方法运行一些戏剧演员,如下所示:
def on_post(self, req, resp):
begin_id = int(req.params["begin_id"])
count = int(req.params["count"])
for page_id in range(begin_id, begin_id + count):
process_vk_page.send(f"https://vk.com/id{page_id}")
resp.status = falcon.HTTP_200
我的代码到达“send”方法,通过循环没有任何问题。但是队列中没有新任务!Actor本身不被调用,我的代理中的“default”队列是空的。如果我设置了自定义队列,它仍然是空的。我的演员是这样的:
^{pr2}$经纪人在哪里
broker = RabbitmqBroker(url="amqp://guest:guest@rabbitmq:5672")
RabbitMQ日志显示它连接良好
我在调试器中做了一些额外的研究。它很好地接收到消息(这是要发送给代理的),并且broker.enqueue输入带选项的Actor.send_()没有返回异常,尽管我无法真正了解它的内部逻辑。我真的不知道为什么会失败,但肯定是RabbitmqBroker.enqueue()这是导致问题的原因。在
代理是erlang22.2.1上的RabbitMQ 3.8.2,在Docker中从RabbitMQDocker Hub image运行,默认设置为。戏剧版是1.7.0。在
在RabbitMQ日志中,只有在应用程序启动时到代理程序的连接,在我关闭它时断开连接,如下所示:
2020-01-05 08:25:35.622 [info] <0.594.0> accepting AMQP connection <0.594.0> (172.20.0.1:51242 -> 172.20.0.3:5672)
2020-01-05 08:25:35.627 [info] <0.594.0> connection <0.594.0> (172.20.0.1:51242 -> 172.20.0.3:5672): user 'guest' authenticated and granted access to vhost '/'
2020-01-05 08:28:35.625 [error] <0.597.0> closing AMQP connection <0.597.0> (172.20.0.1:51246 -> 172.20.0.3:5672):
missed heartbeats from client, timeout: 60s
代理在主包的__init__.py
中定义,并在子包中导入。我不确定在所有函数的decorator中指定相同的代理实例是否合适,但是文档中没有禁止它的内容。我想这没关系,因为如果我为每个演员创建一个新的经纪人,它仍然不起作用。在
我试着把Redis设为经纪人,但我还是遇到了同样的问题。在
这可能是什么原因?在
最有可能的问题是您没有告诉工人使用哪个代理,因为您没有声明默认代理。在
您没有提到您的文件在应用程序中是如何布局的,但是,假设您的代理在
tasks.py
内被定义为broker
,那么您必须让您的工作人员这样了解它:有关更多信息和模式,请参阅
dramatiq help
末尾的示例。在相关问题 更多 >
编程相关推荐