【问题标题】:how to loop through a function into method call in python如何通过函数循环进入python中的方法调用
【发布时间】:2015-10-20 06:34:19
【问题描述】:

我正在尝试为 python kafka 创建一个简单的函数,但在将字符串循环传递给 producer.send_messages 方法时遇到问题。

from kafka import SimpleProducer, KafkaClient
import random
import os

kafka = KafkaClient('localhost:9092')
producer = SimpleProducer(kafka)
x = 0

while x!=1:
        #producer.send_messages(b'test1',b'str(i)') #the program will run with this type of input
        a=random.random()
        message_method= "b"+"'"+topic+"'"+","+"b"+"'"+str(a)+"'"
        producer.send_messages(message_method)

我会遇到这个错误,

 File "<stdin>", line 4, in <module>
  File "/usr/lib/python2.7/site-packages/kafka/producer/simple.py", line 52, in send_messages
    partition = self._next_partition(topic)
  File "/usr/lib/python2.7/site-packages/kafka/producer/simple.py", line 36, in _next_partition
    self.client.load_metadata_for_topics(topic)
  File "/usr/lib/python2.7/site-packages/kafka/client.py", line 378, in load_metadata_for_topics
    kafka.common.check_error(topic_metadata)
  File "/usr/lib/python2.7/site-packages/kafka/common.py", line 233, in check_error
    raise error_class(response)
kafka.common.UnknownError: TopicMetadata(topic="b'test1',b'0.595202345912'", error=17, partitions=[])

我很感激任何建议,以使其成为一种更动态的方式(无需硬编码 b'messages'...等)以将消息也放入 kafka。 :D

【问题讨论】:

  • 你为什么将你的字符串拆分成单字符串,然后将它们连接起来?无论如何,写那行的“现代”方式是message_method = "b'{}',b'{}'".format(topic, a)
  • 是的,还是不行,错误
    File "simpleproducer.py", line 11, in &lt;module&gt; producer.send_messages(message_method) ... kafka.common.check_error(topic_metadata) File "/usr/lib/python2.7/site-packages/kafka/common.py", line 233, in check_error raise error_class(response) kafka.common.UnknownError: TopicMetadata(topic="b'test1,b'0.23424'", error=17, partitions=[])
  • 哦,我不知道是什么导致了这个错误——我只是想给你一个更简洁的方式来写那个字符串。你现在拥有的相当于print('h'+'e'+'l'+'l'+'o'+' '+'w'+'o'+'r' +'l'+'d')
  • 是的,我是在做“穴居人”,但非常感谢您的建议:)。

标签: python apache-kafka kafka-python


【解决方案1】:

你应该这样使用 send_message 函数:

producer.send_messages('test1', str(a))

我觉得比较合适。

【讨论】:

  • 每个参数前面都需要一个字节producer.send_messages(b'test1',b'str(i)')'notation,因为它有字节传输,这会导致条目中的格式很奇怪。
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多