Python 2.7 GCP PubSub:Python中的同步拉订阅服务器?

Python 2.7 GCP PubSub:Python中的同步拉订阅服务器?,python-2.7,google-cloud-pubsub,Python 2.7,Google Cloud Pubsub,全部, 我正在尝试学习如何使用GCP PubSub,并且我能够通过CLI命令(创建主题、订阅、发布到主题、从订阅中提取等)进行测试,但是当我跳转到python(v2.7,当前的公司标准)时,我正在努力以同步方式提取消息 我看过这个网址,它告诉你要睡觉,虽然这是真的,但我无法想象现实世界中会有人这样做,对吗? 这个url告诉您可以使用future.result(),我尝试了它,但它不会像您想象的那样阻止会话/线程: 有人有其他想法吗?这是我的函数,它直接来自其中一个示例: def sample

全部,

我正在尝试学习如何使用GCP PubSub,并且我能够通过CLI命令(创建主题、订阅、发布到主题、从订阅中提取等)进行测试,但是当我跳转到python(v2.7,当前的公司标准)时,我正在努力以同步方式提取消息

我看过这个网址,它告诉你要睡觉,虽然这是真的,但我无法想象现实世界中会有人这样做,对吗?

这个url告诉您可以使用future.result(),我尝试了它,但它不会像您想象的那样阻止会话/线程:

有人有其他想法吗?这是我的函数,它直接来自其中一个示例:

def sample_receive_messages(subscription_name="my-sub", project=None):
"""Receives messages from a pull subscription."""
if not project:
    credentials, project = google.auth.default()  

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

def callback(message):
    # print('Received message: {}'.format(message))
    message.ack()
    print('<message>' + str(message.data) + '</message>')

subscription = subscriber.subscribe(subscription_path)

future = subscription.open(callback)

myResult = future.result()

subscription.close()

print("done")
def sample\u receive\u消息(subscription\u name=“my sub”,project=None):
“”“从请求订阅接收消息。”“”
如果不是项目:
凭据,project=google.auth.default()
subscriber=psub.SubscriberClient()
订阅路径=订阅服务器。订阅路径(
项目、订阅(用户名称)
def回调(消息):
#打印('收到的消息:{}'。格式(消息))
message.ack()
打印(“”+str(message.data)+“”)
订阅=订阅服务器。订阅(订阅路径)
future=subscription.open(回调)
myResult=future.result()
订阅关闭()
打印(“完成”)
最后,我的目标是让一个进程每隔一段时间唤醒一次,抓取并确认消息,将消息写入文件,然后结束

到目前为止,该过程读取消息并打印出来(很好),但随后它会坐着坐着,坐着,坐着,最后会出现一些胡言乱语的错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pubSubTools.py", line 50, in sample_receive_messages
    myResult = future.result()
  File "/usr/local/lib/python2.7/site-packages/google/cloud/pubsub_v1/futures.py", line 98, in result
    raise err
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, The service was unable to fulfill your request. Please try again. [code=8a75])>
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
示例接收消息中第50行的文件“pubsutools.py”
myResult=future.result()
文件“/usr/local/lib/python2.7/site packages/google/cloud/pubsub_v1/futures.py”,结果中的第98行
提出错误
grpc._通道_会合点:

Python库不明确支持同步拉入云发布/订阅API。future.result()是推荐的阻塞方式,但它仍然异步进行拉取

我建议您尝试使用正式的回调函数,其中回调函数调用Queue.put(),然后使用Queue.get()使用消息。

这在以下部分中进行了描述:


其他客户端(Ruby、PHP和命令行界面)似乎不需要被告知不要等待,这就是我希望python选项所做的。感谢您的回复Katayoon,我尝试了它,但仍然无法获得真正的“同步”解决方案,所以我想我要跳出shell,调用CLI,获取JSON格式的stdout并处理它。我刚刚使用了python客户端,它与CLI一样工作,非常好而且简单。gcloud pubsub subscriptions pull--auto ack my sub--format=jsonIt建议将您的解决方案发布为更好地帮助社区的答案。
from google.cloud import SubscriberClient

pubsub_client = SubscriberClient()
subscription_path = 'projects/{project}/subscriptions/{subscription}'.format(project=project_name, subscription=subscription_name)
pull_response= pubsub_client.pull(subscription=subscription_path, max_messages=10)

for msg in pull_response.received_messages:
    message = msg.message.data.decode('utf-8')
    # do your thing
    pubsub_client.acknowledge(subscription_path, [msg.ack_id])