Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python修复一个缓慢的系统_Python_Debugging_Scripting - Fatal编程技术网

用Python修复一个缓慢的系统

用Python修复一个缓慢的系统,python,debugging,scripting,Python,Debugging,Scripting,多处理Python模块的池类。有一个已定义的运行方法来执行任务。通过传递大量任务,为系统拥有的特定数量的CPU创建pool类的pool对象。通过调用map instance方法启动池对象中的每个任务,并将run函数和任务列表作为参数传递。提示:os.walk()通过自顶向下或自底向上遍历目录树来生成目录树中的文件名。这用于在Python中遍历文件系统 Multisync.py #!/usr/bin/env python3 from multiprocessing import Pool def

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

Multisync.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\u备份文件夹

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

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

Dailysync.py

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

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

这个问题是问一个解决方案,用Python修复一个运行缓慢的系统,这是谷歌在Coursera平台上举办的第2周的“疑难解答和调试技术”课程

在我的代码中,我列出了
data/prod/
中的所有目录,然后将该列表用作
run
函数的参数,该函数在进程的池中运行,以便并行启动更多的
rsync

它可以随时使用,您甚至可以复制粘贴它,但请记住,您必须相应地更改您的用户名(它的格式应类似于
student-03-12345678
,请查看代码注释以进行更改)


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

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

2:使用
os.walk()
将绝对路径连接到文件夹,遍历
src
文件夹

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

4:让该功能执行rsync

#/usr/bin/env蟒蛇3
来自多处理导入池
导入操作系统
导入子流程
#1套SRC
src=“{}/data/prod.”格式(os.getenv(“HOME”))
#4-池RSYNC命令
def运行进程(文件夹):
dest=“{}/data/prod_backup.”格式(os.getenv(“HOME”))
子进程调用([“rsync”,“-arq”,文件夹,dest])
#2-设置文件夹数组
文件夹=[]
对于root,_dir,os.walk(src)中的文件:
对于_dir中的名称:
folders.append(os.path.join(root,name))
#3建立并运行游泳池
p=池(len(文件夹))
p、 映射(运行进程、文件夹)

如果有人想试试这个,这个非常酷的代码行数更少:

#!/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", dirs, dest])




p = Pool(len(dirs))
p.map(backingup, dirs)
嗯,对我来说

  • 我将
    src
    设置为全局,因为它在其他函数中引用
  • 使用完整路径名
    src=“{}/data/prod/”.format(os.getenv(“HOME”)
    而不是
    src=“/data/prod/”
  • 了解
    os.walk()
    的工作原理,并访问所需的所有值,例如
    root=next(os.walk(src))[0]
    dirs=next(os.walk(src))[0]
  • 如果文件夹为空
    池(len(folders))
    将返回0,并且映射至少需要1个处理器,因此我处理了它
  • 你的问题是什么?这是一系列命令。。。
    #!/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", dirs, dest])
    
    
    
    
    p = Pool(len(dirs))
    p.map(backingup, dirs)
    
     #!/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)