繁体   English   中英

带有子流程,Python和PSQL的多处理

[英]Multi-Processing with Sub-process, Python, and PSQL

我有100个要处理的位置。 每个位置都需要相同的工作流程,因此我已经开发了一套脚本来做到这一点。

首先,我准备一些Python中的位置文件。 然后,该第1条Python代码使用子流程调用另一个(第2条)Python脚本。 第二个Python调用模块并执行一些例程,然后再次调用Sub-Process来运行一堆PSQL命令。

一旦第一个Python脚本调用了第二个脚本,就可以在下一个位置免费启动。 现在,我允许触发第二个Python的5个实例:

for x, every in enumerate(location):
   .... (PREP CODE)
   if x == 0:
      process = subprocess.Popen(command, shell=True)
   elif x == 1:
      process1 = subprocess.Popen(command, shell=True)
   elif x == 2:
      process2 = subprocess.Popen(command, shell=True)
   elif x == 3:
      process3 = subprocess.Popen(command, shell=True)
   elif x == 4:
      process4 = subprocess.Popen(command, shell=True)

while process.poll() is None:
    time.sleep(0.5)
while process1.poll() is None:
    time.sleep(0.5)
while process2.poll() is None:
    time.sleep(0.5)
while process3.poll() is None:
    time.sleep(0.5)
while process4.poll() is None:
    time.sleep(0.5)

我不使用PIPE或stdout,因为它似乎锁定了子进程的连续调用。 在第二个python中,我进行了大量处理,然后调用:

def execute_psql(code):
    command = 'psql -f %s "host=postgres.local dbname=projects user=david password=XXXXX port=5432"' % (codespace + '\\codes\\' + str(i) + code + '.sql')
    process = subprocess.Popen(command, shell=True)
    while process.poll() is None:
        time.sleep(0.5)

由于必须运行的各个PSQL脚本的数量,因此大约调用了15次。

当我在1个位置上运行这组代码时,它会在3个小时内成功运行并成功完成。 当我仅在两个位置运行时,时间会急剧增加,并且我敢说大多数过程都停止了。 现在我一次测试2个。 在一个位置成功执行了30%的PSQL脚本,在另一个位置成功执行了90%。 当前的PSQL已经分别运行了6和20个小时。

是什么导致代码像这样停顿? 我处于测试理论的中间(例如(1)将shell = True更改为shell = False;例如(2)将包括“ process”在内的所有变量重命名为唯一变量名称)。

在数据库方面:长达20小时的代码只能读取(htop状态= R),并且在一个内核上消耗了100%的CPU。 6小时代码的CPU使用率为3%,并且处于状态D(或不间断睡眠)。

并行化很难实现。 如果位置的顺序无关紧要,则可以制作一个处理一个位置的单线程程序,然后使用外部工具(例如GNU Parallel)将其并行化,这会更容易:

parallel python process_one_location.py ::: location1 location2 location3 .. locationN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM