python - 在 Python 中未正确调用 Google Cloud PubSub
问题描述
我正在挤压我的大脑,但我不明白为什么会发生这个问题,我无法找出原因。我正在尝试读取图像并将其传递给 pubsub。一旦通过 pubsub 发送消息,它就会被重定向到 AutoML 模型以识别或预测给定的图像。下面是代码片段
global val1
@app.route("/", methods=['GET', 'POST'])
doc_type=request.form.get('submit_button')
file_name = secure_filename(file.filename)
blob=file.read()
flash('File upload successful', 'info')
# Initializing PubSub
publisher,subscriber,topic,subscription=pubsub_init(doc_type)
blob=blob+bytes(doc_type,'utf-8')
subscriber.subscribe(subscription,callback)
publisher.publish(topic,blob)
flash("the uploaded file is "+val1,'info')
初始化函数:
def pubsub_init(doctype):
publisher=pubsub.PublisherClient()
subscriber=pubsub.SubscriberClient()
if doctype=="License":
subscription=<<sub name>>
elif doctype=="Credit":
subscription=<<subname>>
elif doctype=="Passport":
subscription=<<subname>>
else:
print("invalid choice"
topic=<<topic>>
print(subscription)
return (publisher,subscriber,topic,subscription)
我的回调:
def callback(message):
#print("hello",flush=True)
print("making global")
project_id=<<proj id>>
val1,val2=predict_value(new_message,model_id,project_id,compute_region)
message.ack()
但是我收到了类似 val1 未定义的错误。你能就此提出建议吗?
解决方案
这里的问题subscriber.subscribe(subscription, callback)
是设置对callback
.
这意味着当您发布一个新主题时,您实际上是在flash(...)
首先执行调用还是回调之间设置竞争条件。由于回调可能需要一些时间才能完成,因此该flash
行获胜,但val1
尚未创建,因此您的错误。
有一些方法可以通过阻止订阅者的未来来控制并发性,这可能使您尝试做的事情成为可能。
但是在尝试之前,我会问您为什么首先尝试在此处使用 pub/sub。似乎您只是在设置发布者和订阅者以发布单个消息,然后尝试对该消息的结果执行某些操作。为什么不直接内联呢?
@app.route("/", methods=['GET', 'POST'])
def your_function(request):
doc_type=request.form.get('submit_button')
file_name = secure_filename(file.filename)
blob=file.read()
flash('File upload successful', 'info')
blob=blob+bytes(doc_type,'utf-8')
# turn a blob into new_message, get model_id from somewhere?
project_id=<<proj id>>
val1,val2=predict_value(new_message,model_id,project_id,compute_region)
flash("the uploaded file is "+val1,'info')
推荐阅读
- nfs - Onos 3 节点 + Atomix 3 节点集群,NFS 上具有持久性卷
- android - 恢复安装在 Android 模拟器 (Flutter) 上的应用程序的源代码
- java - Eclipse Vert.x:用杰克逊解析 java.time 日期
- android - Android:即使应用程序未运行也显示消息通知
- c - 使用数组在 C 中制作帕斯卡三角形的问题
- php - PHP多维数组计数和表中的总和
- javascript - 自定义类事件处理
- sorting - Neo4j - 订购作为中间结果一部分的列表
- hibernate - 构建规范(标准 API)
- apache-spark - wholeTextFile() API 极慢不可扩展