首页 存档 技术 查看内容

Python 多进程教程

2018-3-30 13:00 |来自: 互联网 408 0

摘要: Python2.6版本中新添了multiprocessing模块。它最初由Jesse Noller和Richard Oudkerk定义在PEP 371中。就像你能通过threading模块衍生线程一样,multiprocessing 模块允许你衍生进程。这里用到的思想:因为你现在能 ...

Python2.6版本中新添了multiprocessing模块。它最初由Jesse Noller和Richard Oudkerk定义在PEP 371中。就像你能通过threading模块衍生线程一样,multiprocessing 模块允许你衍生进程。这里用到的思想:因为你现在能衍生进程,所以你能够避免使用全局解释器锁(GIL),并且充分利用机器的多个处理器。


多进程包也包含一些根本不在threading 模块中的API。比如:有一个灵活的Pool类能让你在多个输入下并行化地执行函数。我们将在后面的小节讲解Pool类。我们将以multiprocessing模块的Process类开始讲解。




开始学习multiprocessing模块


Process这个类和threading模块中的Thread类很像。让我们创建一系列调用相同函数的进程,并且看看它是如何工作的。


import os

from multiprocessing import Process

def doubler(number):

"""

A doubling function that can be used by a process

"""

result = number * 2

proc = os.getpid()

print('{0} doubled to {1} by process id: {2}'.format(

number, result, proc))

if __name__ == '__main__':

numbers = [5, 10, 15, 20, 25]

procs = []

for index, number in enumerate(numbers):

proc = Process(target=doubler, args=(number,))

procs.append(proc)

proc.start()

for proc in procs:

proc.join()


对于上面的例子,我们导入Process类、创建一个叫doubler的函数。在函数中,我们将传入的数字乘上2。我们也用Python的os模块来获取当前进程的ID(pid)。这个ID将告诉我们哪个进程正在调用doubler函数。然后,在下面的代码块中,我们实例化了一系列的Process类并且启动它们。最后一个循环只是调用每个进程的join()方法,该方法告诉Python等待进程直到它结束。如果你需要结束一个进程,你可以调用它的terminate()方法。


当你运行上面的代码,你应该看到和下面类似的输出结果:


5 doubled to 10 by process id: 10468

10 doubled to 20 by process id: 10469

15 doubled to 30 by process id: 10470

20 doubled to 40 by process id: 10471

25 doubled to 50 by process id: 10472


有时候,你最好给你的进程取一个易于理解的名字 。幸运的是,Process类确实允许你访问同样的进程。让我们来看看如下例子:


import os

from multiprocessing import Process, current_process

def doubler(number):

"""

A doubling function that can be used by a process

"""

result = number * 2

proc_name = current_process().name

print('{0} doubled to {1} by:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部