设置Python发布/订阅异步请求订阅服务器线程数
我使用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):
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].