进程: 程序运行在操作系统上的一个实例, 就称之为进程.进程需要相应的系统资源:内存,时间片,pid.
创建进程:
1. 首先要导入multiprocessing中的Process;
2. 创建一个Process对象
3. 创建Process对象时, 可以传递参数;
4. 使用start()启动进程;
5. 结束进程.
Process语法结构:
Process([group [, targrt [, name [, args [, kwargs]]]]])
target: 如果传递了函数的引用, 可以让这个子进程就执行函数中的代码
args: 给targrt指定的函数传递参数, 以元组的形式进行传递
kwargs: 给targrt指定的函数传递参数, 以字典的形式进行传递
name: 给进程设定一个名字, 可以省略
group: 指定进程组, 大多数情况下用不到
Process 创建的实例对象的常用方法有:
start() : 启动子进程实例
is_alive(): 判断进程子进程是否还活着
join(timeout): 是否等待子进程执行结束, 或者等待多时秒
terminate():不管任务是否完成, 立即终止子进程
Process 创建的实例对象的常用属性:
name: 当前进程的别名, 默认为Process-N, N为从1开始递增的整数
pid: 当前进程的pid(进程号)
注意: 进程之间不共享全局变量
进程之间的通信-Queue
在初始化Queue()对象时, (例如q=Queue(),若在括号中没有指定最大可接受的消息数量, 或数量为负值时, 那么
就代表可接受的消息数量没有上限-直到内存的尽头)
Queue.qsize(): 返回当前队列包含的消息数量.
Queue.empty(): 如果队列为空, 返回True,反之False.
Queue.full(): 如果队列满了, 返回True, 反之False.
Queue.get([block[, timeout]]): 获取队列中的一条消息, 然后将其从队列中移除, block默认值为True.
如果block使用默认值, 且没有设置timeout(单位秒), 如果队列为空, 此时程序将被阻塞(停在读取状态), 直到从消息队列读到消息
为止, 如果设置了timeout, 则会等待timeout秒, 若还没有读取到任何消息, 则抛出"Queue.Empty"异常.
如果block值为False, 消息队列如果为空, 则会立刻抛出"Queue.Empty"异常;
Queue.get_nowait(): 相当Queue.get(False);
Queue.put(item, [block[, timeout]]): 将item消息写入队列, block默认值为True;
如果block使用默认值, 且没有设置timeout(单位秒), 消息队列如果已经没有空间可写入, 此时程序将被阻塞(停在写入状态), 直到消息队列腾出空间为止, 如果设置了timeout, 则会等待timeout秒, 若还没空间, 则抛出'Queue.Full'异常
如果block值为False, 消息队列如果没有空间写入, 则会立刻抛出'Queue.Full'异常;
Queue.put_nowait(item); 相当Queue.put(item, False);
进程间通信Demo:
进程池 Pool
multiprocessing.Pool常用函数解析:
apply_async(func, argsl kwds]) :使用非阻塞方式调用func (并行执行,堵塞方式必须等上一个
进程退出才能执行下一个进程) , args为传递给func的参数列表, kwds为传递给fur的关键字参数列表;
close() :关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出,必须在close或terminate之后使用;
进程池中使用Queue
如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue() ,而不是 multiprocessing.Queue(),否则会得到一
条如下的错误信息:
RuntimeError: Queue objects should only be shared between processes through inheritance.