【问题标题】:How to execute multiple independent statements at the same time in Python/psycopg2?如何在 Python/psycopg2 中同时执行多个独立语句?
【发布时间】:2019-06-06 04:24:19
【问题描述】:

我在 PostgreSQL 中有三个物化视图需要很长时间才能刷新(每个都超过几个小时),我需要每天刷新它们。

我目前正在使用 Python 脚本执行此操作,该脚本一个接一个地刷新视图,但与在 pgAdmin 中手动刷新它们相比,它需要三倍的时间(我可以在不同的选项卡中同时运行所有三个刷新)。

这就是我的代码现在的样子:

import psycopg2
config = {'connection details'}
conn = psycopg2.connect(**config)
cur = conn.cursor()

# This is the part that I want to run simultaneously
cur.execute('REFRESH MATERIALIZED VIEW gsam.mv_hist_wip_data')
cur.execute('REFRESH MATERIALIZED VIEW gsam.mv_hist_ver_data')
cur.execute('REFRESH MATERIALIZED VIEW gsam.mv_hist_verda_data')

conn.close()

如何使用 Python 和 psycopg2 同时执行三个 REFRESH MATERIALIZED VIEW 语句?

【问题讨论】:

    标签: python psycopg2


    【解决方案1】:

    您可以使用多处理池请查看文档here。并检查以下示例

    import psycopg2
    from multiprocessing import Pool
    
    def main():
        p = Pool(processes=3)
        view_names = ['mv_hist_wip_data','mv_hist_ver_data', 'mv_hist_verda_data']
        result = p.map(refresh_view, view_names)
    
    def  refresh_view(view_name):
    
        config = {'connection details'}
        conn = psycopg2.connect(**config)
        cur = conn.cursor()
        # This is the part that I want to run simultaneously
        cur.execute('REFRESH MATERIALIZED VIEW gsam.%s', (view_name,))
        conn.close()
    

    【讨论】:

    • 谢谢!您的解决方案效果很好!我唯一需要改变的是def main():,因为它抛出了一个错误。应该是if __name__ == '__main__':
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多