设置Python发布/订阅异步请求订阅服务器线程数

设置Python发布/订阅异步请求订阅服务器线程数,python,multithreading,python-3.x,asynchronous,google-cloud-pubsub,Python,Multithreading,Python 3.x,Asynchronous,Google Cloud Pubsub,我使用Python实现了异步拉订阅服务器。这是基本代码 def receive_messages(project, subscription_name): subscriber = pubsub_v1.SubscriberClient() subscription_path = subscriber.subscription_path( project, subscription_name) def callback(message):

我使用Python实现了异步拉订阅服务器。这是基本代码

def receive_messages(project, subscription_name):

    subscriber = pubsub_v1.SubscriberClient()
    subscription_path = subscriber.subscription_path(
        project, subscription_name)

    def callback(message):
        print ("A")
        time.sleep(2)
        print('Received message: {}'.format(message))
        message.ack()
        print ("B")

    subscriber.subscribe(subscription_path, callback=callback)

    print('Listening for messages on {}'.format(subscription_path))
    while True:
        time.sleep(60)
我需要像这样打印

A,

信息

B

A

信息

B

(我需要按顺序运行)或通过给定数量的线程接收消息。我没有找到限制线程数量的方法。由于线程太多,我的程序出现了分段错误


如何控制接收消息的线程数。

使用策略可以解决此问题

from google.cloud import pubsub_v1
from concurrent import futures

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project, subscription_name)

def callback(message):
        print (str(message.data) + " " + str(threading.current_thread()))
        message.ack()
flow_control = pubsub_v1.types.FlowControl(max_messages=10)
executor = futures.ThreadPoolExecutor(max_workers=5)
policy = pubsub_v1.subscriber.policy.thread.Policy(subscriber, subscription_path, executor=executor, flow_control=flow_control)
policy.open(callback)

我们可以使用max\u workers设置最大线程数。还可以设置流控制设置。

如果需要按顺序运行处理回调,最好使用消息传递模型,而不是修改订阅服务器内部。如果将接收到的消息推送到显式队列,则可以确保只有一个工作进程退出此队列,并且一次只处理一个工作进程。但是,请注意,如果只有一个订阅作业,那么这将为您提供“一次一个”的处理保证,但它不会为您提供任何订购保证。消息仍然可以按照与发布顺序相关的任意顺序进行处理。

Hi,当我尝试上述代码时,它启动了15个线程,然后一个接一个地重新启动进程。我不明白它是怎么做到的。而且,即使有15个线程,它也会占用100%的CPU使用率。你能帮我解释一下吗?谢谢,上面的代码为我工作。但如果使用subscriber.subscribe();方法在默认情况下添加10个线程。请参阅[1]中的“使用流控制接收消息”方法。[1].