一、进程补充:

1,生产者消费者模型:

  两类角色,一类负责生产数据,另外那类负责数据

  生产完放到共享空间,另外那类到空间取数据进行处理

  好处: 生产数据的同时可以进行数据的处理,不用等(并发效果)

  问题:要有共享空间(1.文件--硬盘,速度慢;2.内存)

     要有锁

  队列可以完美解决既是内存空间又自带加锁功能

2,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

二、共享数据(了解,主要使用队列)

 from multiprocessing import Process,Manager,Lock
def work(dic,mutex):
with mutex:
dic['count']-=1 if __name__ == '__main__':
mutex=Lock()
m=Manager()
share_dic=m.dict({'count':100})
l_p=[]
for i in range(100):
p=Process(target=work,args=(share_dic,mutex))
l_p.append(p)
p.start()
for i in l_p:
i.join()
print(share_dic)

三、进程池(重要知识点)

1.进程池:放进程的池子 -- 控制进程的数量

2. n个cpu 开n个进程 效率最高

3.进程池可以指定大小,如不指定   默认是cpu的个数

4.应用

apply,忘记apply

弊端:apply效率低,串行--主程序要等一个程序运行完才能运行下一个

 from multiprocessing import Pool
import time,os,random
def task(n):
print('%s is running'%os.getpid())
time.sleep(random.randint(1,3))
print('%s is done'%os.getpid())
return n**2 if __name__ == '__main__':
p=Pool(4)
obj_l=[]
for i in range(1,7):
obj=p.apply_async(task,args=(i,)) #async提交的是任务 ,不是进程
obj_l.append(obj)
p.close()
p.join()
print('zhu')
for obj in obj_l:
print(obj.get()) #等进程都运行完,一起取结果 -- 并发
#如果运行完一个进程就取一个结果的话 和apply的效果是一个性质-- 串行

apply_async

#  p.close()      # 禁止往进程池内再添加任务

5. apply_async 的应用:

 from multiprocessing import Pool
from socket import *
s=socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('127.0.0.1',8088))
s.listen(5)
def talk(conn):
while True:
try:
cmd=conn.recv(1024)
if not cmd:break
conn.send(cmd.upper())
except Exception:
break
conn.close() if __name__ == '__main__':
p=Pool(4)
while True:
conn,addr=s.accept()
p.apply_async(talk,args=(conn,))
s.close()
#不用考虑主进程等进程池的关闭

多进程并发通信

#也不用考虑返回值接收的问题

6.回调函数(属于主进程

应用场景:爬虫

 from multiprocessing import Pool
import requests
import os
import time
def get_page(url):
print('<%s> is getting [%s]' %(os.getpid(),url))
response=requests.get(url)
time.sleep(2)
print('<%s> is done [%s]' % (os.getpid(), url))
return {'url':url,'text':response.text}
def parse_page(res):
print('<%s> parse [%s]' %(os.getpid(),res['url']))
with open('db.txt','a') as f:
parse_res='url:%s size:%s\n' %(res['url'],len(res['text']))
f.write(parse_res)
if __name__ == '__main__':
p=Pool(4)
urls = [
'https://www.baidu.com',
'http://www.openstack.org',
'https://www.python.org',
'https://help.github.com/',
'http://www.sina.com.cn/'
]
for url in urls:
p.apply_async(get_page,args=(url,),callback=parse_page)
p.close()
p.join()
print('主',os.getpid())

通常进程池的里面的任务是耗时间的,不耗时间(比进程池里的任务耗时短)的任务放到回调函数中

下载完就会调解析功能,节省时间

最新文章

  1. WINCE 获取智能设备唯一编号
  2. Android消息机制
  3. FastDFS 上传文件
  4. Apache—DBUtils
  5. JavaScript 类
  6. js设计模式(8)---享元模式
  7. HW4.21
  8. 未能写入输出文件 c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary
  9. zookeeper错误KeeperErrorCode = ConnectionLoss解决
  10. 201521123103 《Java程序设计》第三周学习总结
  11. ES6 对象的扩展(上)
  12. global文件中的application_start方法中做: 定时器
  13. 使用 C#/.NET Core 实现单体设计模式
  14. javascript深入浅出图解作用域链和闭包
  15. Linux col命令详解
  16. Unity 琐碎(4) 可视化辅助调试Giamos
  17. mciSendString 多线程播放多首音乐 &amp; 注意事项
  18. phalcon bug: model的findFirst会自动忽略一些空格
  19. etcd集群的搭建
  20. python zip压缩文件 并移动到指定目录

热门文章

  1. Linux基础命令---mkfs
  2. netty4----日志框架的检查
  3. Java高并发高性能分布式框架从无到有微服务架构设计
  4. 计算概论(A)/基础编程练习1(8题)/7:奇数求和
  5. php在Nginx环境下进行刷新缓存立即输出,实现常驻进程轮询。
  6. MySQL中INSERT的一般用法
  7. 20145330 《网络对抗》 Eternalblue(MS17-010)漏洞复现与S2-045漏洞的利用及修复
  8. CodeForces 76A Gift - 最小生成树
  9. linux下使用grep在当前目录下搜索所有文件中含有的字符串
  10. 动态规划模板1|LIS最长上升子序列