我正在使用异步工作流,其中包含同步代码。如何检查同步功能是否阻塞,以确保在执行过程中没有中断。
SELECT OrderLine.ProductID, SUM(OrderLineQuantity)FROM OrderLine Inner Join [Order] ON OrderLine.OrderID = [Order].OrderID WHERE OrderStatus = 'Completed'
在上面的代码中,我如何检查函数write和send_message是否未阻塞?它们与db一起工作,我无法访问它是否检查一切是否按预期进行。我还可以假设,如果函数write_locally可以正常工作,那么我以前的函数也可以正常工作吗?
函数write和send_message几乎可以做同样的事情-它们获取数据并使用传递给它们的连接和游标在PostgreSQL db上执行查询。函数write_locally使写入csv文件。
trainable_model = keras.models.load_model(
path, custom_objects={'Attention': Attention, 'MultiTaskLoss': MultiTaskLoss}, compile=True) # tried with compile=False
trainable_model.summary()
input = trainable_model.inputs[0]
i_output = trainable_model.get_layer('i_output').output
t_output = trainable_model.get_layer('t_output').output
testable_model = keras.models.Model(
inputs=input, outputs=[i_output, t_output])
# Tried without below for loop.
for l in testable_model.layers:
l_name = l.name
l.set_weights(trainable_model.get_layer(name=l_name).get_weights())
testable_model.compile('adam', loss={
'i_output': 'categorical_crossentropy', 't_output': 'categorical_crossentropy'})
return testable_model
我还必须添加,该连接和游标是使用aiopg创建的,因此它们的所有方法都是协程。
答案 0 :(得分:1)
如果连接和游标具有协程方法,则编写的send_message
不会阻塞事件循环。
但是,它不会做任何事情,因为它无法等待它所调用的协同程序。它需要使用async def
进行定义,并且需要await
对cur.execute(...)
和cur.commit()
的调用。 download_upload_xmls_async
同样无法等待send_message
。正确的代码应如下所示:
async def download_upload_xmls_async(message, count, id, conn1, cursor1, conn2, cursor2):
... some code here ...
# note the await
await send_message("Send" + xml, id, conn2, cursor2)
# write_locally doesn't need to be a coroutine because
# it (presumably) doesn't block
write_locally(data)
await message.ack()
# note "async def"
async def send_message(message, id, con, cur, **nargs):
params = {
#some params
}
union_params= {**params, **nargs}
data = json.dumps(union_params, ensure_ascii=False)
# note the await
await cur.execute(
#Query
)
await con.commit()