希望有人可以提供帮助,我遇到了一个我似乎无法编写脚本的具有挑战性的情况。我的目标是自动将 SQL 文件加载到 PostgreSQL 中。
我不知道我有多少个 SQL 文件文件夹,所以最初我检查一个文件夹是否存在,然后遍历每个文件并使用 psql.exe 将其加载到 PostgreSQL
我当前的代码看起来像这样
if os.path.exists("sql1"):
for files in os.listdir("sql1"):
load1 = subprocess.Popen("psql -d data -U postgres -f sql1\%s" %files)
if os.path.exists("sql2"):
for files in os.listdir("sql2"):
load2 = subprocess.Popen("psql -d data -U postgres -f sql2\%s" %files)
但是,这会假脱机这么多子进程,因为它为文件夹中的每个 SQL 文件创建一个子进程,并为每个文件夹创建更多子进程。
如果我将它更改为 subprocess.call 它当然会序列化加载并阻止从下一个文件夹加载文件,而不是为每个文件夹运行一个进程。
有谁知道我如何为每个存在的文件夹创建一个进程?
除此之外,我将运行索引,但仅在所有进程完成后。
我可以使用 load.wait() 但这仅适用于一个进程。
提前感谢您的建议和帮助
编辑添加:
接受史蒂夫的建议,我引入了一些线程,但它仍然导致索引在子进程完成之前开始
def threads(self):
processors = multiprocessing.cpu_count()
n = 1
name = "sql%i" %n
for i in range(processors):
if os.path.exists(name):
thread = Thread(target=self.loadData, args=(name,))
thread.start()
n += 1
name = "sql%i" %n
def loadData(self, name):
for files in os.listdir(name):
load = subprocess.Popen("psql -d osdata -U postgres -f %s\%s" %(name, files))
load.wait()
但是索引在进程完成之前就开始了。
任何想法如何防止这种情况