1.进程对列
让进程之间共享资源
先进先出
(1)基本语法
from multiprocessing import Process,Queue q = Queue() # 1.用put方法往队列中存值 q.put(111) # 2.用get方法从队列中取值 res= q.get() print(res) # 3.当队列中没有值,再调用get就会发生阻塞 res = q.get() print(res) # 4.get_nowait 在没有值的时候,直接报错。错在兼容性问题,不推荐使用 res = q.get_nowait() print(res) # (2) 指定队列长度 可以适用queue q1 = Queue(3) q1.put(11) q1.put(22) q1.put(33) # 注意:如果超出队列长度,直接阻塞 # q1.put(44) # 注意:如果超出了队列长度,直接报错(不推荐) # q1.put_nowait(44)
(2)多进程之间共享数据
from multiprocessing import Process,Queue def func(q): # 2.在子进程中获取数据 res = q.get() print(res) # 3.子进程添加数据 q.put("bbb") if __name__ == '__main__': q2 = Queue() p1 = Process(target=func,args=(q2,)) p1.start() # 1.在主进程中,添加数据 q2.put("aaa") # 为了能够拿到子进程中添加的队列元素,需要等待子进程执行结束后获取 p1.join() # 4.主进程获取子进程添加的数据 res = q2.get() print("主进程执行结束:值%s" % (res))
2.生产者和消费者模型
# 爬虫例子:
1号进程负责抓取网页当中的内容
2号进程负责匹配网页当中的关键字
1号进程可以理解为生产者
2号进程可以理解为消费者
理想的生产者和消费者模型:彼此运行的速度相当;
从程序上来讲:
生产者就是负责存储数据(put)
消费者就是负责获取数据(get)
(1)基本语法
from multiprocessing import Process,Queue import time,random def consumer(q,name): while True: food = q.get() time.sleep(random.uniform(0.1,1)) print("%s 吃了一个%s"% (name,food)) # 生产者模型 def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.1,1)) print("%s 生产了 %s%s"%(name,food,i)) q.put(food+str(i)) if __name__ == '__main__': q=Queue() # 创建生产者 p1 = Process(target=producer,args=(q,"周永林","大便")) p1.start() # 创建消费者 c1 = Process(target=consumer,args=(q,"张龙")) c1.start() p1.join() print("主程序执行结束。。。")
3.JoinableQueue
put 寻访
get 获取
task_done 队列数据减一
join 阻塞
task_done 与 join 通过一个中间变量统计队列中元素个数
每放入一个值,成员中的中间变量值加1
每执行一次task_done,成员中的中间变量值减1
join 会根据中间变量值来确定是阻塞还是放行
如果中间变量是0 意味着放行
如果中间变量不是0 意味着阻塞
(1)基本用法
from multiprocessing import Process,JoinableQueue jq = JoinableQueue() jq.put("abab") print(jq.get()) jq.task_done() # jq.join() print("finish")
(2)生产者和消费者模型
from multiprocessing import Process,JoinableQueue # 消费着模型 def consumer(q,name): while True: food = q.get() time.sleep(random.uniform(0.1,1)) print("%s吃了一个%s"%(name,food)) q.task_done() #生产着模型 def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.1,1)) print("%s生产了 %s%s"%(name,food,i)) q.put(food+str(i)) if __name__ == '__main__': # 创建队列 jq = JoinableQueue() #消费着进程 c1 = Process(target=consumer,args=(jq,"张晓东")) c1.daemon = True c1.start() #生产者进程 p1 = Process(target=producer,args=(jq,"黄乐熙","大茄子")) p1.start() #等待生产者把所有数据放到队列中; p1.join() # 直到所有数据被消费完毕之后,放行。 jq.join() print("主程序执行结束。。。")