如何对来自未绑定队列的消息进行多进程

时间:2019-02-20 16:13:38

标签: python apache-kafka multiprocessing

我正在编写一个Python应用程序。它使用使用者读取kafka主题。对于每条消息,它会做一些工作,然后再花一些时间才能完成下一条消息的工作。

大多数使用多处理库的应用程序都涉及将一些有限的可迭代对象传递给map_async或apply_async。我尝试使用这两个函数解决此问题的尝试似乎无效,我认为是因为在这种情况下,我们可迭代的是kafka主题,这是一个未绑定的队列。在这种情况下,有没有办法以非阻塞的方式“做一些事情”?

1 个答案:

答案 0 :(得分:1)

您可以创建一个子流程,并将消息传递给它以处理一些东西:

from confluent_kafka import Consumer, KafkaError
from multiprocessing import Process


def do_stuff(msg):
    my_stuff = 'is doing here as a non-blocking way'

c = Consumer({
    'bootstrap.servers': 'mybroker',
    'group.id': 'mygroup',
    'auto.offset.reset': 'earliest'
})

c.subscribe(['mytopic'])

while True:
    msg = c.poll(1.0)

    if msg is None:
        continue
    if msg.error():
        print("Consumer error: {}".format(msg.error()))
        continue

    process = Process(target=do_stuff, args=(msg.value().decode('utf-8'), ))
    process.start()

c.close()