multiprocessing模块

由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。

process

构造方法:

Process([group [, target [, name [, args [, kwargs]]]]])

group:线程组,目前还没有实现,库引用中提示必须是None;

target:要执行的方法

name:进程名

args/kwargs:要传入方法的参数

实例方法:

is_alive():返回进程是否在运行

join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。

 

start():进程准备就绪,等待CPU调度

run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

 

terminate():不管任务是否完成,立即停止工作进程

属性

daemon:和线程的setDeamon功能一样守护进程

name:进程名字。

pid:进程号。

  • Python的进程调用
from multiprocessing import Process
import time
def foo(q):
time.sleep(1)
print(q) if __name__=="__main__": l=[]
for i in range(3): p=Process(target=foo,args=("W"))
l.append(p)
p.start()
for i in l:
i.join()
print("end") "D:\Program Files\python.exe" E:/py_code/进程队列/进程队列.py
W
W
W
end Process finished with exit code 0

上述进程的调用是比较常规的调用。

  • Proscess继承类
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self):
super(MyProcess, self).__init__()
# self.name = name def run(self): print ('hello', self.name,time.ctime())
time.sleep(1) if __name__ == '__main__':
p_list=[]
for i in range(3):
p = MyProcess()
p.start()
p_list.append(p)
for p in p_list:
p.join()
print('end') "D:\Program Files\python.exe" E:/py_code/进程队列/进程队列.py
hello alvin:1 Thu Jul 20 18:07:56 2017
hello alvin:0 Thu Jul 20 18:07:56 2017
hello alvin:2 Thu Jul 20 18:07:56 2017
end Process finished with exit code 0

上面的代码定义了一个类并继承了一个进程,并开启了5个进程,这5个进程会均会执行MyProcess类中的run方法即打印 ('hello',self.name,time.ctime())。

  • 进程间的通讯(Queue)
from multiprocessing import Process,Queue
import queue def foo(q):
q.put("1") def bar(q): print(q.get(),"ok") if __name__=="__main__":
q=Queue() #相等于q=queue.Queue()
for i in range(3):
p=Process(target=foo,args=(q,)) p1=Process(target=bar,args=(q,))
p1.start()
p.start() "D:\Program Files\python.exe" E:/py_code/进程队列/进程队列.py
1 ok
1 ok
1 ok Process finished with exit code 0
  • 管道(pipe)

管道()函数返回由管道连接的一对连接对象,该管道默认是双向的(双向的)。例如:

def foo(o):
data=o.recv()
print(data)
o.send("hey!whatmini") if __name__=="__main__":
sock,conn=Pipe()#sock与conn相当于管道的两个接口
#
t1=Process(target=foo,args=(conn,))
t1.start()
sock.send("你好")
print(sock.recv()) "D:\Program Files\python.exe" E:/py_code/进程队列/进程队列.py
你好
hey!whatmini Process finished with exit code 0

需要注意的是:Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏

manager

Queue和pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。

from multiprocessing import Process, Manager

def foo(l,i):
l.append(i*i) if __name__ == '__main__': with Manager() as manager: manager=Manager() l = manager.list([11,22,33]) #创建一个列表也可以字典类型都支持
p_list = []
for i in range(10):
p = Process(target=foo, args=(l,i))
p.start()
p_list.append(p) for res in p_list:
res.join() print(l) "D:\Program Files\python.exe" E:/py_code/进程队列/进程队列.py
[11, 22, 33, 4, 1, 9, 36, 81, 0, 49, 16, 64, 25] Process finished with exit code 0
进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

from multiprocessing import Pool   #
import time def foo(args):
time.sleep(1)
print(args) if __name__ == '__main__':
p = Pool(5) #进程池对象的最大量为5个
for i in range(30): #30个任务5个进程对象去执行
p.apply_async(func=foo, args= (i,)) #异步执行 p.close() # 等子进程执行完毕后关闭线程池
# time.sleep(2)
# p.terminate() # 立刻关闭线程池
p.join() #主进程等待所有子进程执行完毕,必须在close或terminate之后

进程池内部维护一个进程序列,当使用时,去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有以下几个主要方法:

1 apply:从进程池里取一个进程并执行

2 apply_async:apply的异步版本

3 terminate:立刻关闭线程池

4 join:主进程等待所有子进程执行完毕,必须在close或terminate之后

6 close:等待所有进程结束后,才关闭线程池

multiprocessing模块的更多相关文章

  1. 使用multiprocessing模块创建多进程

    # 使用multiprocessing模块创建多进程 # multiprcessing模块提供了一个Process类来描述一个进程对象. # 创建子进程时,只需要传入一个执行函数和函数的参数,即可完成 ...

  2. python MultiProcessing模块进程间通信的解惑与回顾

    这段时间沉迷MultiProcessing模块不能自拔,没办法,python的基础不太熟,因此就是在不断地遇到问题解决问题.之前学习asyncio模块学的一知半解,后来想起MultiProcessin ...

  3. 多进程Multiprocessing模块

    多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...

  4. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  5. 进程初识和multiprocessing模块之Process

    一.什么是进程 进程就是运行中的程序 进程是操作系统中最小的资源分配单位 进程与进程之间的关系 : 数据隔离的 进程的id:Process id = pid pid是一个全系统唯一的对某个进程的标识, ...

  6. 30、进程的基础理论,并发(multiprocessing模块)

    我们之前基于tcp所做的通信都只能一个一个链接只有关闭当前链接时才能去链接下一个通信,这显然与现实情况不合.今天我们将来学一个新的概念进程,来做一个python多进程的并发编程.还会贴一个用json序 ...

  7. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  8. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  9. python之多进程multiprocessing模块

    process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...

随机推荐

  1. 201521123017 《Java程序设计》第4周学习总结

    1. 本周学习总结 2. 书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图)   Q2.面向对象设计(大作业1,非常重要) 2.1 将 ...

  2. 201521123005 《java程序设计》 第二周学习总结

    1. 本周学习总结 ·java中的字符串及String的用法 "=="比较的是两字符串的地址,而不是内容 String类的对象是不可变的,创建之后不能进行修改 ·数组Array的用 ...

  3. wampserver启动不起来的原因?

    如果没怎么动wamp的配置文件就发现wampserver启动不起来了,那么可能你碰到了iis服务器. 原因是apache的端口占用的是80,而iis的端口占用也是80所以造成了不能启动wampserv ...

  4. informix服务端口和oralce服务端口

    查找informix的服务端口1>>more .profile 找到: INFORMIXDIR=/home/informix INFORMIXSERVER=aaaa2>>cd ...

  5. React Native 轻松集成分享功能(iOS 篇)

    产品一直催我在 RN 项目中添加分享功能,一直没找到合适的库,今天让我看到了一个插件分享给大家. 在集成插件之前,需要在各大开放平台上成功注册应用,并通过审核(支持 3 个可选的主流平台).支持的平台 ...

  6. Appium (win7系统)环境搭建----完整版

    首先感谢  http://www.cnblogs.com/puresoul/p/4696638.html  和 http://www.cnblogs.com/fnng/p/4540731.html   ...

  7. MySQL binlog 的恢复操作

     测试出有个问题:mysqlbinlog 不加任何参数 恢复整个binlog 日志文件发现里面有这个操作 SET @@SESSION.GTID_NEXT 的操作,  如果需要恢复文件的时候就需要把他过 ...

  8. JavaScript中的ASCII碼轉換成字符的兩種方法

    方法一:轉義字符 \xxx:用十六進制的ASCII碼值轉換成字符. 方法二:String方法 String.fromCharCode(value): //用十進制的ASCII碼值轉換成字符. 舉例:結 ...

  9. RabbitMQ消息队列之一:RabbitMQ的环境安装及配置

    RabbitMQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们 ...

  10. iOS连续dismiss几个ViewController的方法

    原文链接:http://blog.csdn.net/longshihua/article/details/51282388 presentViewController是经常会用到的展现ViewCont ...