Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rabbitmq 如何将gevent与Kombu一起使用_Rabbitmq_Gevent_Kombu - Fatal编程技术网

Rabbitmq 如何将gevent与Kombu一起使用

Rabbitmq 如何将gevent与Kombu一起使用,rabbitmq,gevent,kombu,Rabbitmq,Gevent,Kombu,我正在使用kombu和rabbitmq以及gevent用python编写一个基本的发布-订阅脚本。当消费者在队列中等待消息到达时,我们如何将上下文切换到发布者?我尝试使用gevent.sleep(),但在我的情况下它不起作用 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue May 30 12:15:56 2017 @author: kartikkillawala """ from kombu import Co

我正在使用kombu和rabbitmq以及gevent用python编写一个基本的发布-订阅脚本。当消费者在队列中等待消息到达时,我们如何将上下文切换到发布者?我尝试使用gevent.sleep(),但在我的情况下它不起作用

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue May 30 12:15:56 2017

@author: kartikkillawala
"""
from kombu import Connection,Exchange,Queue,Producer
from kombu.mixins import ConsumerMixin

import gevent
from gevent import Timeout

class Worker(ConsumerMixin):

    def __init__(self,connection,queues):
        self.connection=connection
        self.queues=queues


    def get_consumers(self,Consumer,channel):
        return([Consumer(queues=self.queues,callbacks= self.on_message] )])

    def on_message(self,body,message):
        print("Got Message: {0}".format(body))
        message.ack()
        self.should_stop=True
        gevent.sleep(1)


class MessageVerify:

    exchange_name = "Test-Exchange"
    exchange_type = "direct"
    queue_name = "Test-Queue"
    routing_key = "ABC"

    connection_producer = None

    channel_producer = None

    exchange_producer = None

    producer = None
    consumer = None

    queue = None
    worker = None

    def __init__(self,rabbitmq1):
        self.connection_producer = Connection(hostname=rabbitmq1['host'],userid=rabbitmq1['username'],password=rabbitmq1['password'])

        self.channel_producer = self.connection_producer.channel()

        self.exchange_producer = Exchange(name =self.exchange_name,type=self.exchange_type)

        self.queue = Queue(name=self.queue_name,exchange=self.exchange_producer,routing_key=self.routing_key)
        self.queue.maybe_bind(self.connection_producer)
        self.queue.declare()

    def sendMessage(self,routing_key,data):

        self.producer = Producer(channel=self.channel_producer,exchange=self.exchange_producer,routing_key=routing_key)
        self.producer.publish(data,routing_key=routing_key)
        print("[p]Published Message",data,'with routing key',routing_key)
        gevent.sleep(2)        


    def receiveMessage(self,routing_key,timeout=120):
        try:
            print ("Worker run")
            timer = Timeout(timeout)
            timer.start()
            gevent.sleep(2)
            self.worker = Worker(self.connection_producer,self.queue)
            self.worker.run()
        except Timeout:
            print("Connection Timeout")


rabbitmq1 = {
        "username":"guest",
        "password":"guest",
        "host":"localhost"}
msg_verify = MessageVerify(rabbitmq1)
threads = [gevent.spawn(msg_verify.receiveMessage("ABC",timeout=120)),gevent.spawn(msg_verify.sendMessage("ABC","Sample Message"))]
gevent.joinall(threads)

print ("After joinall")

如果将来有人发现这一点,在使用spawn时,您需要将函数本身及其参数传递给spawn,而不是使用参数调用它。这将导致同步执行和gevent错误,因为第一个spawn参数不可调用。当然,在相互依赖的情况下,就像在这段代码中一样,同步执行意味着它将死锁,所以您永远不会看到错误。