python - 如何规避错误 pq_flush: could not send data to client: Broken pipe found
问题描述
我正在尝试使用看起来像这样的 Lambda 函数创建一个异步过程:
- Lambda 1 在我的 redshift 集群上触发一个查询并结束
- Lambda 2 轮询集群以获取查询状态,并根据结果结束/成功
我使用了几种不同的选项,但它们似乎都在某一时刻失败了。我可以创建一个查询,并触发它,并让 lambda 结束,但是当查询完成执行而不是成功时,它会抱怨客户端连接不再存在
error pq_flush: could not send data to client: Broken pipe found in xyz
问题是这完全符合我的用例的预期。我不希望客户端(Lambda 1)等待,因为我的查询可能需要一个小时才能运行(夸张但可能),这就是我创建第二个 lambda 的原因。有没有办法可以将它传达给 Redshift/postgresql 并规避这个问题?
这是我的触发代码(最终会转到 lambda,但我正在本地机器上进行测试)
import select
import psycopg2
def wait(conn):
while True:
state = conn.poll()
if state == psycopg2.extensions.POLL_OK:
break
elif state == psycopg2.extensions.POLL_WRITE:
select.select([], [conn.fileno()], [])
elif state == psycopg2.extensions.POLL_READ:
select.select([conn.fileno()], [], [])
else:
raise psycopg2.OperationalError("poll() returned %s" % state)
conn = psycopg2.connect(
user='someuser',
dbname='somedb',
host='myredshiftcluster',
port=5432,
password='somepassword',
async_=1,
sslmode="require"
)
wait(conn)
acurs = conn.cursor()
acurs.execute('call public.test_sp(\'xyz\')')
解决方案
ODBC 和 JDBC 连接是同步的,因此构建异步进程将无法正常工作。幸运的是,AWS 最近宣布了 Redshift Data API,它是一个异步 REST 接口。因此,您可以通过该方法执行您正在寻找的内容。
请参阅:https ://docs.aws.amazon.com/redshift/latest/mgmt/data-api.html
推荐阅读
- javascript - 如何在此处使用 Find():Vue.js
- python - Basic guessing game doesn't give any output
- java - 将 JSON 从 Python 发送到 Java
- ios - 在下载文件夹文件应用程序中将 tableview 保存为 PDF 问题 | 迅速
- php - 无法从 PHP 中的 Mysql 数据库中检索 JSON 数据
- r - 在 read_csv 之后在 Shiny 中将数字日期转换为 YMD 时遇到问题
- javascript - 将外部 SVG 文件加载到 SVGJS(重复的 SVG 标签)
- i2c - I2C 从机中的确认
- php - 在文本中搜索单词并替换它们
- vb.net - 整数加法的溢出异常