我尝试使用芹菜。我已经通过芹菜教程的命令安装了 rabbit-mq :
sudo apt-get install rabbitmq-server
当我在一个文件中编写代码并运行它来测试功能时,一切运行良好。但是当我尝试在Django视图中添加我的代码,然后对我的视图执行并发请求时,我遇到了这种异常:
File "/home/kinmanz/PycharmProjects/GitFace/myvenv/lib/python3.5/site-packages/amqp/connection.py", line 464, in drain_events
return self.blocking_read(timeout)
File "/home/kinmanz/PycharmProjects/GitFace/myvenv/lib/python3.5/site-packages/amqp/connection.py", line 468, in blocking_read
frame = self.transport.read_frame()
File "/home/kinmanz/PycharmProjects/GitFace/myvenv/lib/python3.5/site-packages/amqp/transport.py", line 251, in read_frame
'Received {0:#04x} while expecting 0xce'.format(ch))
amqp.exceptions.UnexpectedFrame: Received 0x00 while expecting 0xce
我认为问题可能在于请求的并发性,我应该以某种方式使队列并发安全。
我使用的是Python 3.5,Celery 4.0.0,RabbitMQ 3.5.7
amqplib 实际上有问题,请参阅下面的答案。
答案 0 :(得分:1)
可能对于遇到同样问题的人,我会列出我设法找到的可能解决方案。如果您知道更好的解决方案,请添加您的答案或评论我的。
如果您使用的是 Python 2.x ,请查看该问题https://github.com/celery/celery/issues/922 实际上在 amqplib 中的问题如果在 librabbitmq 上发生变化,所有这些都应该正常工作,这很容易做到,请参阅: Framing Errors in Celery 3.0.1
但是如果您使用的是 Python 3.x ,则无法以这种方式解决该问题,因为没有可用的Python 3兼容 librabbitmq ,看到该问题https://github.com/celery/celery/issues/2066,但在这种情况下,您可以在 redis 上更改结果后端,例如:
1)安装redis服务器:
$ sudo aptitude install redis-server
2)更改您的应用配置
app = Celery('tasks', backend='redis://localhost', broker='pyamqp://')
有关安装的一些有用链接 redis :Setting up an asynchronous task queue for django using celery redis和Celery-redis quick guide
对于 Python 3 ,您可以尝试在 Python 2.7 中运行celery worker,同时您的应用正在使用 Python 3 ,在这种情况下不要忘记安装 librabbitmq 而不是 amqplib 。 (这种方式似乎不方便)