我先研究了一下,找不到问题的答案。我试图在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())
我希望能够同时创建两个目录,因为每分钟我都要计算创建了多少个文件。如果目录不在那里,我就没有时间了。
这可以通过Ray来实现,该系统允许您轻松地并行化和分发Python代码。
要并行化示例,需要使用
@ray.remote
装饰器定义函数,然后使用.remote
调用它们。如果将同一个参数传递给两个函数,并且参数很大,则使用
ray.put()
是一种更有效的方法。这样可以避免将大参数序列化两次并创建其两个内存副本:如果
func1()
和func2()
返回结果,则需要按如下方式重写代码:与multiprocessing模块相比,使用Ray有许多优点。尤其是,同一代码将在一台机器上以及在一组机器上运行。有关Ray的更多优点,请参见this related post。
您可以使用^{} 或^{} 。
由于peculiarities of CPython,
threading
不太可能实现真正的并行。因此,multiprocessing
通常是更好的选择。下面是一个完整的示例:
启动/连接子进程的机制可以很容易地按照
runBothFunc
的思路封装到函数中:如果您的函数主要执行I/O工作(以及更少的CPU工作),并且您有Python3.2+,则可以使用ThreadPoolExecutor:
如果您的函数主要执行CPU工作(而I/O工作较少),并且您有Python2.6+,则可以使用multiprocessing模块:
相关问题 更多 >
编程相关推荐