debugging 用Python修复运行缓慢的系统

t30tvxxf  于 2022-11-14  发布在  Python
关注(0)|答案(5)|浏览(152)

多处理Python模块的Pool类。有一个定义的run方法来执行任务。通过传递您拥有的多个任务,创建系统拥有的特定数量CPU的Pool类的池对象。通过调用map示例方法启动池对象中的每个任务,并将run函数和任务列表作为参数传递。提示:walk()通过自上而下或自下而上遍历目录树来生成目录树中的文件名,这在Python中用于遍历文件系统。

多重同步行程.py

#!/usr/bin/env python3
from multiprocessing import Pool
def run(task):
  # Do something with task here
    print("Handling {}".format(task))
if __name__ == "__main__":
  tasks = ['task1', 'task2', 'task3']
  # Create a pool of specific number of CPUs
  p = Pool(len(tasks))
  # Start each task within the pool
  p.map(run, tasks)

/data/prod的子文件夹层次结构,data来自不同的项目(例如,beta、gamma、kappa),它们彼此独立。您必须使用多处理和子处理模块方法将/data/prod中的数据同步到/data/prod_backup文件夹。
尝试应用多处理,它利用空闲的CPU核心进行并行处理。在这里,您必须使用多处理和子进程模块方法将/data/prod中的数据同步到/data/prod_backup文件夹。
提示:os.walk()通过自上而下或自下而上遍历目录树来生成目录树中的文件名,这在Python中用于遍历文件系统。
Dailysync.py

#!/usr/bin/env python
import subprocess
src = "/data/prod/"
dest = "/data/prod_backup/"
subprocess.call(["rsync", "-arq", src, dest])
mmvthczy

mmvthczy1#

对我来说
1.我将src设置为全局,因为它在其他函数中被引用;
1.请使用完整路径名称src = "{}/data/prod/".format(os.getenv("HOME")),而不要使用src = "/data/prod/"
1.了解os.walk()的工作原理,并访问所需的所有值,如root = next(os.walk(src))[0]dirs = next(os.walk(src))[0]
1.如果文件夹是空的,Pool(len(folders))将返回0,并且Map至少需要1个处理器,所以我处理了它。

#!/usr/bin/env python
 import subprocess
 from multiprocessing import Pool
 import os
 
 global src
 src = "{}/data/prod/".format(os.getenv("HOME"))
 
 
 def sync_data(folder):
     dest = "{}/data/prod_backup/".format(os.getenv("HOME"))
     subprocess.call(["rsync", "-arq", folder, dest])
     print("Handling {}".format(folder))
 
 
 if __name__ == "__main__":
     folders = []
     root = next(os.walk(src))[0]
     dirs = next(os.walk(src))[1]
 
     for dir in dirs:
         folders.append(os.path.join(root, dir))
 
     pool = Pool(len(folders)) if len(folders) != 0 else Pool(1)
     pool.map(sync_data, folders)
dced5bon

dced5bon2#

如果有人想试试这个,这个很酷,代码更少:

#!/usr/bin/env python3

from multiprocessing import Pool
import os
import subprocess

src = "/home/student-01-#######/data/prod"
dirs = next(os.walk(src))[1]

def backingup(dirs):
    dest = "/home/student-01-#######/data/prod_backup"
    subprocess.call(["rsync", "-arq", src+'/'+ dirs, dest])



p = Pool(len(dirs))
p.map(backingup, dirs)
km0tfn4u

km0tfn4u3#

这是我最后的回答,基本上是:
1:将源(src)设置为绝对文件路径。
2:遍历src文件夹,其中os.walk()将绝对路径连接到该文件夹。
3:创建池并将函数Map到字典
4:让函数执行rsync

#!/usr/bin/env python3
from multiprocessing import Pool
import os
import subprocess

# 1 - Set SRC
src = "{}/data/prod".format(os.getenv("HOME"))

# 4 - Pool RSYNC commands
def runprocess(folder):
    dest = "{}/data/prod_backup".format(os.getenv("HOME"))
    subprocess.call(["rsync", "-arq", folder, dest])

# 2 - Set folders array
folders = []
for root, _dir, files in os.walk(src):
   for name in _dir:
      folders.append(os.path.join(root, name))

# 3 Build and run the Pool
p = Pool(len(folders))
p.map(runprocess, folders)
zxlwwiss

zxlwwiss4#

我也是Python的新手,和你学习的是同一门课程。我附上了下面的代码,我为这个任务写的,它完成了任务。
我知道这不是最有效的代码,这就是为什么更有经验的人可以检查它,以及改进它

#!/usr/bin/env python
import subprocess
import os
from multiprocessing import Pool

os.chdir('../data/')
list=[]
for path,dir,file in os.walk('prod/'):
        list.append(dir)
list=list[0]
def backup(list):
        src = "../data/prod/"+str(list)
        dest = "../data/prod_backup/"
        subprocess.call(["rsync", "-arq", src, dest])
if __name__=="__main__":
        p=Pool(len(list))
        p.map(backup,list)
jqjz2hbq

jqjz2hbq5#

此问题是针对在Coursera平台上托管的Google故障排除和调试技术(第2周)课程的使用Python修复运行缓慢的系统测试提出的解决方案。
在我的代码中,我列出了data/prod/中的所有目录,然后将该列表用作run函数的参数,该函数在ProcessPool中运行,以便并行启动更多的rsync示例
它已经可以使用了,您甚至可以复制粘贴它,但请记住,您必须相应地更改您的用户名(它应该是student-03-12345678这样的格式,请查看代码注解来更改它)。

#!/usr/bin/env python
import os
import subprocess
from multiprocessing import Pool

src = "data/prod/"
dest = "data/prod_backup/"

def run(dir):
    subprocess.call(["rsync", "-arq", src + str(dir), dest])

os.chdir(os.getenv("HOME"))
dirs = []
for path,dir,file in os.walk(src):
    dirs.append(dir)

dirs=dirs[0]
print(dirs) #Used to debug

# Create the pool
p = Pool(len(dirs))

# Start tasks
p.map(run, dirs)

相关问题