多处理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])
嗯,对我来说
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]
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)
如果有人想尝试这个,这很酷,代码行数更少:
#!/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)
这是我的最终答案,基本上是:
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)
#!/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)
我也是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)
这个问题要求解决 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)