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("主程序执行结束。。。")

最新文章

  1. 从Java文件到字节码文件
  2. 在PHP中如何实现在做了么个操作后返回到指定页面
  3. Python的平凡之路(21)
  4. python编程技巧2
  5. 0x00411202指令引用的0x00000000内存该内存不能为read错误,怎么解决
  6. python模拟浏览器保存Cookie进行会话
  7. 浅谈mysql中不同事务隔离级别下数据的显示效果
  8. 发送一个简单的http get 请求并且响应
  9. 循环对XML文档添加Attribute以及移除Element 【转】
  10. HDU--杭电--3790--最短路径问题
  11. phing用户手册第四章Getting Started译文
  12. C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网
  13. PLSQL Developer 远程连接Oracle数据库
  14. 克隆Rockey6加密狗复制资料
  15. firewall
  16. <Android基础>(二) Activity Part 2
  17. NEX 事件
  18. cmp指令
  19. 并发编程之 CountDown 源码分析
  20. BZOJ2728 HNOI2012与非(并查集+数位dp)

热门文章

  1. django的几种缓存配置
  2. Flask debug 模式 PIN 码生成机制安全性研究笔记
  3. iTerm2快速SSH连接并保存密码
  4. 工具---《.264视频 转成 MP4视频》
  5. LoadRunner(6)
  6. 关于WebMvcConfigurationSupport的大坑-静态资源访问不了
  7. jwt、token
  8. Java笔记(基础第二篇)
  9. pandas中DataFrame和Series的数据去重
  10. Hivesql中的正则