多次运行相同功能时提高性能

时间:2017-10-09 16:53:33

标签: python python-3.x

我目前正在编写一个基于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秒才能运行,我想提高性能,但我不知道如何。我应该走哪个方向?并行,线程,多处理等......?

非常感谢。

1 个答案:

答案 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/

希望这有帮助!

相关问题