python - Flask 邮件给出了 celery 的 Pickling 错误

标签 python flask rabbitmq celery flask-mail

我尝试使用 Celery(和rabbitmq)与 Flask 邮件异步发送电子邮件。最初,我遇到了来自 flask 破坏 celery 的 render_template 的问题 - Flask-Mail breaks Celery ( celery 任务仍会成功执行,但不会发送任何电子邮件)。当我试图解决这个问题时(仍然没有解决!) - 我偶然发现了另一个问题。这种酸洗错误是由于线程锁紧造成的。我注意到当我改变调用 celery 任务的方式(从延迟到 apply_async)时,问题就开始了。从那时起,我尝试恢复我的更改,但仍然无法消除该错误。任何有关任何一个问题的帮助都将受到高度赞赏。

回溯:

File "/Users/.../python2.7/site-packages/celery/app/amqp.py",          line 250, in publish_task
    **kwargs
File "/Users/.../lib/python2.7/site-packages/kombu/messaging.py", line 157, in publish
compression, headers)
File "/Users/.../lib/python2.7/site-packages/kombu/messaging.py", line 233, in _prepare
    body) = encode(body, serializer=serializer)
File "/Users/.../lib/python2.7/site-packages/kombu/serialization.py", line 170, in encode
    payload = encoder(data)
File "/Users/.../lib/python2.7/site-packages/kombu/serialization.py", line 356, in dumps
    return dumper(obj, protocol=pickle_protocol)
PicklingError: Can't pickle <type 'thread.lock'>: attribute lookup thread.lock failed

任务.py

from __future__ import absolute_import
from flask import render_template
from flask.ext.mail import Message
from celery import Celery

celery = Celery('tasks', 
            broker = 'amqp://tester:testing@localhost:5672/test_host')

@celery.task(name = "send_async_email")
def send_auth_email(app, nickname, email):
    with app.test_request_context("/"):
        recipients = []
        recipients.append(email)
        subject = render_template("subject.txt")
        msg = Message(subject, recipients = recipients)
        msg.html = render_template("test.html", name = nickname)
        app.mail.send(msg)   

在测试用例中我只是调用:

send_auth_email.delay(test_app, nick, email)

仅供引用:如果我不使用 celery(即同步),API 工作得非常好。提前致谢!

最佳答案

当您调用send_auth_email.delay(test_app, nick, email)时,所有函数参数都将发送到任务队列。为此, celery 将它们腌制。

简短回答test_app,作为 flask 应用程序,使用了一些魔法并且不能被腌制。请参阅docs了解什么可以腌制、什么不可以腌制的详细信息。

一种解决方案是传递所有必要的参数(在您的情况下,这似乎只是名称)以在 send_auth_email 中重新实例化 test_app

关于python - Flask 邮件给出了 celery 的 Pickling 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19567203/

相关文章:

python - Jsonify 自定义对象列表

python - 如何从 Flask 中运行 python 脚本

queue - 删除 RabbitMQ 中的队列

java - RabbitListener 多队列行为

python - 如何从 telnetlib 命令只读取最后一个缓冲区

python - 相互减去列表中的所有项目

python - Flask 大型教程,帖子未显示在/index 中

rabbitmq - correlation id 和 delivery tag 有什么区别

python - 重写 sqlalchemy 中的关系行为

Python - 从文件中的每一行中提取特定数字