使用Python修复缓慢的系统

问题描述 投票:0回答:6

多处理Python模块的Pool类。有一个定义的运行方法来执行任务。通过传递您拥有的多个任务,创建系统具有的特定数量的 CPU 的 Pool 类的池对象。通过调用 map 实例方法来启动池对象中的每个任务,并将 run 函数和任务列表作为参数传递。提示: os.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 子文件夹的层次结构,数据来自不同的项目(例如,beta,gamma,kappa),并且它们彼此独立。您必须使用多处理和子进程模块方法将数据从/data/prod同步到/data/prod_backup文件夹。

尝试应用多处理,它利用空闲的 CPU 核心进行并行处理。在这里,您必须使用多处理和子进程模块方法将数据从 /data/prod 同步到 /data/prod_backup 文件夹。

提示:os.walk() 通过自上而下或自下而上遍历目录树来生成目录树中的文件名。这用于在Python中遍历文件系统。

每日同步.py

#!/usr/bin/env python
import subprocess
src = "/data/prod/"
dest = "/data/prod_backup/"
subprocess.call(["rsync", "-arq", src, dest])
python debugging scripting
6个回答
4
投票

嗯,对我来说

  1. 我将
    src
    设置为全局,因为它在其他函数中被引用;
  2. 使用完整路径名
    src = "{}/data/prod/".format(os.getenv("HOME"))
    而不是
    src = "/data/prod/"
  3. 了解
    os.walk()
    的工作原理,并访问所需的所有值,例如
    root = next(os.walk(src))[0]
    dirs = next(os.walk(src))[0]
  4. 如果文件夹为空
    Pool(len(folders))
    将返回0,并且映射需要至少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)

4
投票

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

#!/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)

0
投票

这是我的最终答案,基本上是:

1:将源(src)设置为绝对文件路径。

2:遍历

src
文件夹,用
os.walk()
加入文件夹的绝对路径。

3:创建Pool并将函数映射到字典

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)

0
投票
#!/usr/bin/env python3

from multiprocessing import Pool
import subprocess
import os

#Get the absolute paths for source and destiny
cwd = os.getcwd()
src = os.path.join(cwd,"data/prod/")
dest = os.path.join(cwd,"data/prod_backup/")

#Get all the directories in the source directory
dirs = next(os.walk(src))[1]

#Function to make the backups
def backup(dir):
  origin=os.path.join(src,dir)
  subprocess.call(["rsync", "-arq", origin, dest]) 

#Build and run the Pool
p=Pool(len(dirs))
p.map(backup,dirs)

-1
投票

我也是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)

-1
投票

这个问题要求解决 Google 的 Troubleshooting and Debugging Techniques(第 2 周)课程的 Fix a Slow system with Python 测试,该课程托管在 Coursera 平台上。

在我的代码中,我列出了

data/prod/
中的所有目录,然后使用该列表作为在
Process
Pool 中运行的 run 函数的参数,以便启动更多
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)
© www.soinside.com 2019 - 2024. All rights reserved.