0
import gnsq

class something():
    def __init__(self, pb=None, pk=None, address=None):
        self.pb = pb
        self.pk = pk
        self.address = address

    def connect(self):
        consumer = gnsq.Consumer(self.pb, 'ch', self.address)

        @consumer.on_message.connect
        def response_handler(consumer, msg):
           return msg.body

        consumer.start()

我将如何获得 so 的返回值response_handler,我将能够传递给父函数connect(),所以当我调用它时,它将返回message.body来自子函数的值。

我会想到以下内容:

import gnsq

class something():
    def __init__(self, pb=None, pk=None, address=None):
        self.pb = pb
        self.pk = pk
        self.address = address

    def connect(self):
        consumer = gnsq.Consumer(self.pb, 'ch', self.address)

        @consumer.on_message.connect
        def response_handler(consumer, msg):
           return msg.body

        consumer.start()

       return response_handler

nsq = something('pb', 'pk', 'address')

# should print whatever message.body is
print nsq.connect() 

但它不起作用。注意:consumer.start()正在阻塞

4

1 回答 1

1

你所问的在实际情况下是没有意义的Consumer()

在您的connect()方法中,您设置了一个消费者,设置了一个响应处理程序并使用consumer.start(). 从那时起,只要有消息要消费,消费者就会使用该消息调用处理程序。不只是一次,而是一次又一次。

您的处理程序可能会被多次调用,除非消费者已关闭,否则您永远不知道何时完成 - 因此,您的connect()方法无法返回完整的结果。

您可以做的是让 connect 方法返回对集合的引用,该集合将在任何时候包含迄今为止收集的所有消息。起初它是空的,但一段时间后,它可能包含所有收到的消息。

就像是:

import gnsq

class Collector():
    def __init__(self, topic, address):
        self.topic = topic
        self.address = address
        self.messages = []

    def connect(self):
        self.messages = []
        consumer = gnsq.Consumer(self.pb, 'ch', self.address)

        @consumer.on_message.connect
        def response_handler(consumer, msg):
           self.messages.append(msg)

        consumer.start()
        return self.messages

我不认为这真的是你想要使用它的方式,只有在你提供更多关于为什么以及如何使用这个输出的上下文时才真正有意义。

于 2019-11-18T05:05:18.067 回答