1.进程介绍
进程:一个程序运行起来后,代码+用到的资源称之为进程,他是操作系统分配资源的最小单元
进程也可以完成多任务。
2.进程跟线程的区别:
1.进程不共享全局变量,各自划分出一块内存空间,占用内存资源比较多
2.线程共享全局变量,占用资源比较少
3.线程是进程的一部分。
3.multiprocessing模块
target 如果传递了函数的引用,可以任务这个子进程就执行这里的代码
args 给target 指定的函数传递的参数,以元祖的方式传递
kwargs 给target指定的安徽省农户传递命名参数
name 给进程设定一个名字,可以不设定
group 指定进程组,大多数情况下用不到
Process 创建的实例对象的常用方法:
start() 启动子进程
is_alive() 判断子进程是否还活着
join() 是否等待子进程执行结束,或等待多少秒
terminate() 不管任务是否完成,立即终止子进程
Process 创建的实例对象的常用属性:
name 当前进程的别名
pid 当前进程的pid
4.进程间通信 - Queue
multiprocessing.Queue()和queue.Queue()区别
1.queue.Queue()是进程内阻塞队列
2.multiprocessing.Queue()是跨进程通信队列
3.多进程前者是各自私有,后者是各自进程共有
4.Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信
例子:
from multiprocessing import Process,Queue
def work1(q):
while q.qsize()>0:
print(q.get())
def work2(q):
while q.qsize()>0:
print(q.get())
if __name__ == '__main__':
注意:队列要在下面创建,如果在上面闯将将不能共享全局变量。
q = Queue()
for i in range(10):
q.put("http://www.baidu.com")
p = Process(target=work1,args=(q,))
p1 = Process(target=work2, args=(q,))
p.start()
p1.start()
5.进程池子
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池
还没满,那么久创建一个新的进程用来执行该请求;但是如果池中的进程数已经达到指定的最大值
那么请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。
pool 常用方法
apply_async() 使用非租塞方式调用func
close() 关闭pool
terminate() 不管任务是否完成立即终止
join() 主进程阻塞,等待子进程的退出,必须在close或terminate之后使用
例子:
import os
import time
from multiprocessing import Process,Queue,Manager,Pool
def work1():
print("进程池---{}".format(os.getpid()))
time.sleep(1)
if __name__ == '__main__':
p = Pool(3)
for i in range(10):
p.apply_async(work1)
p.close()
p.join()
6.进程池中的queue
如果使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue()
例子:
import os
import time
from multiprocessing import Pool,Manager
def work1(q):
print("进程池---{}".format(os.getpid()))
print(q.get())
time.sleep(1)
if __name__ == '__main__':
Manager()
q = Manager().Queue()
for i in range(10):
q.put("你好啊")
p = Pool(3)
for i in range(10):
p.apply_async(work1)
p.close()
p.join()