如何并行运行函数?

新手上路,请多包涵

我先进行了研究,但找不到我的问题的答案。我正在尝试在 Python 中并行运行多个函数。

我有这样的事情:

 files.py

import common #common is a util class that handles all the IO stuff

dir1 = 'C:\folder1'
dir2 = 'C:\folder2'
filename = 'test.txt'
addFiles = [25, 5, 15, 35, 45, 25, 5, 15, 35, 45]

def func1():
   c = common.Common()
   for i in range(len(addFiles)):
       c.createFiles(addFiles[i], filename, dir1)
       c.getFiles(dir1)
       time.sleep(10)
       c.removeFiles(addFiles[i], dir1)
       c.getFiles(dir1)

def func2():
   c = common.Common()
   for i in range(len(addFiles)):
       c.createFiles(addFiles[i], filename, dir2)
       c.getFiles(dir2)
       time.sleep(10)
       c.removeFiles(addFiles[i], dir2)
       c.getFiles(dir2)

我想调用 func1 和 func2 并让它们同时运行。这些函数不会相互交互,也不会在同一对象上交互。现在我必须等待 func1 在 func2 开始之前完成。我该怎么做如下所示:

 process.py

from files import func1, func2

runBothFunc(func1(), func2())

我希望能够几乎同时创建两个目录,因为我每分钟都在计算正在创建的文件数量。如果该目录不存在,它会打乱我的时间安排。

原文由 lmcadory 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 363
2 个回答

您可以使用 threadingmultiprocessing

由于 CPython 的特性threading 不太可能实现真正的并行性。因此, multiprocessing 通常是更好的选择。

这是一个完整的例子:

 from multiprocessing import Process

def func1():
  print 'func1: starting'
  for i in xrange(10000000): pass
  print 'func1: finishing'

def func2():
  print 'func2: starting'
  for i in xrange(10000000): pass
  print 'func2: finishing'

if __name__ == '__main__':
  p1 = Process(target=func1)
  p1.start()
  p2 = Process(target=func2)
  p2.start()
  p1.join()
  p2.join()

启动/加入子进程的机制可以很容易地按照您的 runBothFunc 封装到一个函数中:

 def runInParallel(*fns):
  proc = []
  for fn in fns:
    p = Process(target=fn)
    p.start()
    proc.append(p)
  for p in proc:
    p.join()

runInParallel(func1, func2)

原文由 NPE 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你的函数主要做 I/O 工作(和较少的 CPU 工作)并且你有 Python 3.2+,你可以使用 ThreadPoolExecutor

 from concurrent.futures import ThreadPoolExecutor

def run_io_tasks_in_parallel(tasks):
    with ThreadPoolExecutor() as executor:
        running_tasks = [executor.submit(task) for task in tasks]
        for running_task in running_tasks:
            running_task.result()

run_io_tasks_in_parallel([
    lambda: print('IO task 1 running!'),
    lambda: print('IO task 2 running!'),
])

如果你的函数主要做 CPU 工作(和较少的 I/O 工作)并且你有 Python 2.6+,你可以使用 multiprocessing 模块:

 from multiprocessing import Process

def run_cpu_tasks_in_parallel(tasks):
    running_tasks = [Process(target=task) for task in tasks]
    for running_task in running_tasks:
        running_task.start()
    for running_task in running_tasks:
        running_task.join()

run_cpu_tasks_in_parallel([
    lambda: print('CPU task 1 running!'),
    lambda: print('CPU task 2 running!'),
])

原文由 David Foster 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题