Python:如何并行运行python函数?

发布于 2021-02-02 23:12:47

我先研究了一下,却找不到答案。我试图在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())

我希望能够几乎同时创建两个目录,因为我每分钟都在统计要创建多少个文件。如果该目录不存在,将会拖延我的时间。

关注者
0
被浏览
120
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    你可以使用threading或multiprocessing。

    由于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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看