我目前正在编写一个基于Python的应用程序,该应用程序多次运行相同的功能,但从不使用相同的参数。
该应用程序的目标是通过pywinrm模块将PowerShell命令发送到服务器。这是一个简化的代码片段,用于更新Windows文件夹的权限:
server = input('Please provide a server: ')
path = input('Provide the path of the folder: ')
permissions = ['Read', 'ReadAndExecute', 'List', 'Write', 'Modify']
run_ps_cmd(server, path, permissions[0])
run_ps_cmd(server, path, permissions[1])
run_ps_cmd(server, path, permissions[2])
run_ps_cmd(server, path, permissions[3])
run_ps_cmd(server, path, permissions[4])
目前,它需要20秒才能运行,我想提高性能,但我不知道如何。我应该走哪个方向?并行,线程,多处理等......?
非常感谢。
答案 0 :(得分:0)
为了让它们并行运行,我只需将它们全部添加到多处理池中。
from multiprocessing import Pool
from functools import partial
server = input('Please provide a server: ')
path = input('Provide the path of the folder: ')
permissions = ['Read', 'ReadAndExecute', 'List', 'Write', 'Modify']
run_ps = partial(run_ps_cmd, (server, path))
# required due to how Pool.map only takes an interable
# to pass each item in it to the function.
p = Pool(processes=5)
results = p.map(run_ps, permissions)
p.terminate()
p.join()
在Python 3中,它支持作为上下文管理器运行:
with Pool(processes=5) as p:
results = p.map(run_ps, permissions)
我会警告不要在没有实际知道run_ps_cmd
的代码的情况下并行运行,或者如果线程池是I / O绑定就足够了(在这种情况下,为{{1}切换Pool
来自ThreadPool
。)
包含更多信息的随机文章http://chriskiehl.com/article/parallelism-in-one-line/
希望这有帮助!