Python子进程假脱机进程太多

时间:2012-11-21 09:12:42

标签: python postgresql subprocess

希望有人可以提供帮助,我有一个挑战性的情况,我似乎无法编写脚本。我的目标是自动将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(),但这只适用于一个进程。

提前感谢您的建议和帮助

编辑增加:

根据Steve的建议,我介绍了一些线程,但它仍然导致索引在子进程完成之前启动

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()                                                                                                                                                                                 

但索引在进程完成之前就开始了。

任何想法如何防止

1 个答案:

答案 0 :(得分:0)

我建议为每个文件夹创建一个帖子。然后使用subprocess.call序列化每个线程中的调用。

如果你想节制并发执行的线程数,你应该看看Python的期货模块。

http://docs.python.org/dev/library/concurrent.futures.html

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=2) as executor:
    for n in range(processors):
        name = "sql%i" % (n + 1)
        if os.path.exists(name):
            future = executor.submit(loadData, name)