我尝试在回调中使用exchange名称。我在Pika中使用SelectConnection适配器处理异步请求。
我的想法是首先在我的程序中构建交换、队列和绑定的列表。然后,我将多个交换和队列声明分派给Pika,并在每个绑定所需的队列和交换收到DeclareOK消息后立即创建绑定。
这意味着我需要知道回调中交换和队列的名称,以便我可以将它们与要创建的绑定相关联。
类似这样:
print "Create A"
channel.exchange_declare(callback=on_exchange, exchange="exchangeA")
print "Create B"
channel.exchange_declare(callback=on_exchange, exchange="exchangeB")
def on_exchange(response):
# How do I know if this was exchangeA or exchangeB ?
print "Exchange declared"
print response
这将给出以下输出,清楚地表明首先声明交换,然后触发回调(如预期的那样):
Create A
Create B
Exchange declared
<METHOD(['method=<Exchange.DeclareOk>', 'channel_number=1', 'frame_type=1'])>
Exchange declared
<METHOD(['method=<Exchange.DeclareOk>', 'channel_number=1', 'frame_type=1'])>
我已经弄明白,反应属于皮卡类型。框架但我如何从那里开始呢?交易所是否保证按顺序申报?
似乎无法读取回调中的exchange名称。相反,您需要做的是保留一个计数器,以便知道何时创建了所有交易所:
class ...:
def __init__(self):
self.exchangestocreate = 2
#...
def declare_exchanges(self):
channel.exchange_declare(callback=self.on_exchange, exchange="exchangeA")
channel.exchange_declare(callback=self.on_exchange, exchange="exchangeB")
def on_exchange(self, response):
self.exchangestocreate -= 1
if self.exhangestocreate == 0:
# Declare bindings here
这将有效地使接口在exchange声明步骤中同步。
您可以相应地链接回调以控制安装过程。只需逐步建立您的交易所和队列。这更为冗长,但您可以控制。
class ChatServer(object):
def __init__(self):
self.channel_in = None
self.channel_out = None
cred = pika.PlainCredentials('guest','guest')
param = pika.ConnectionParameters(host='localhost',
port=5672,
virtual_host='/',
credentials=cred)
self.connection = pika.SelectConnection(param,self.on_connected)
def on_connected(self, connection):
self.connection.channel(self.on_channel_out_open)
def on_channel_out_open(self,channel):
self.channel_out = channel
self.channel_out.exchange_declare(exchange='chatserver_out',
type='direct',
auto_delete=False,
callback=self.on_exchange_declare_out)
def on_exchange_declare_out(self,method_frame):
self.channel_out.exchange_declare(exchange='cmd',
type='direct',
auto_delete=False,
callback=self.on_exchange_declare_cmd_out)
def on_exchange_declare_cmd_out(self,method_frame):
# now all exchanges are defined.
# Let's create the queues.
# ...
闭包是保持代码异步的解决方案:
def declare_exchanges(self):
exchange = "exchangeA"
callback = self.on_exchange(exchange)
channel.exchange_declare(callback=callback, exchange=exchange)
exchange = "exchangeB"
callback = self.on_exchange(exchange)
channel.exchange_declare(callback=callback, exchange=exchange)
def on_exchange(self, exchange):
def callback(response):
print(exchange)
return callback
PS:我在上游开了一个问题,https://github.com/pika/pika/issues/898
我有一个简单的枚举类,我想在其中有一个名为name的字段。 不幸的是,这在静态编程语言中似乎不起作用。编译失败,消息: 错误:(9,5)静态编程语言:冲突声明:枚举条目名称,公共最终val名称:字符串 同样的Enum类作为Java代码工作正常。如何用静态编程语言解决这个问题?
我有困难建立一个有3个类的结构。我不确定包含/转发声明。 下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。 倾斜度。h 倾斜度 倾角读数.h 结构正确吗?如何访问其他类中的枚举? 提前道谢。 编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。
如何在命名空间中转发声明类。例如,下面是一个库的头文件,用户不需要知道私有的myPtr,所以当包含在头文件下面时,不需要包含boost头文件。那么我如何向前声明boost::shared_ptr以启用用户代码编译呢? MyClass.h
本文向大家介绍javascript中声明函数的方法及调用函数的返回值,包括了javascript中声明函数的方法及调用函数的返回值的使用技巧和注意事项,需要的朋友参考一下
问题内容: 如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容: 有没有更优雅或更简洁的方法? 问题答案: 我喜欢这个:
问题内容: 我正在编写一个小程序,以有序的方式定时显示我的Rubik立方体解。但是Python(3)一直困扰着我关于全局声明之前使用时间的困扰。但是奇怪的是,它在开始时就声明为(是,是列表),然后在函数(他抱怨的地方)中再次声明为,并使用对其进行“全局”处理。这是我的代码,因此您可以根据需要进行分析: 任何帮助将不胜感激,因为我是Python世界的新手:) 问题答案: 全局声明是当你声明是 如果声