0

誰かが助けてくれることを願っています。私は、スクリプトを作成できないような困難な状況にあります。私の目的は、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() を使用できますが、それは 1 つのプロセスでしか機能しません。

事前にアドバイスと助けをありがとう

追加された編集:

スティーブのアドバイスを受けて、いくつかのスレッドを導入しましたが、それでもサブプロセスが完了する前にインデックス作成が開始されます

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

ただし、プロセスが完了する前にインデックス作成が開始されます。

それを防ぐ方法についてのアイデア

4

1 に答える 1

0

フォルダごとにスレッドを作成することをお勧めします。次に、subprocess.call各スレッド内で呼び出しをシリアル化するために使用します。

同時に実行するスレッドの数を調整したい場合は、Python の futures モジュールを調べる必要があります。

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)
于 2012-11-21T09:59:30.977 に答える