1. ホーム
  2. python

[解決済み] 関数を並列に実行するには?

2022-04-27 15:28:19

質問

まず調べてみたのですが、答えが見つかりませんでした。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())

毎分何個のファイルが作成されるかをカウントしているので、両方のディレクトリをほぼ同時に作成できるようにしたいのです。もしディレクトリがなければ、私のタイミングは狂ってしまうでしょう。

解決方法は?

を使用することができます。 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)