一、进程池
1、 每开启进程,开启属于这个进程的内存空间(寄存器 堆栈 文件),进程越多操作系统的调度越频繁
2、进程池:
(1)python中的 先创建一个属于进程的池子
(2)这个池子指定能存放多少个进程
(3)先将这些进程建好
3、更高级的进程池(有上下限)

from multiprocessing import Pool,Process
import time
def func(n):for i in range(10):print(n+1)
if __name__ == '__main__':start = time.time()pool = Pool(5)                #有五个进程的池子pool.map(func,range(100))     #100个任务,传的参数必须是可迭代的,map:自带close和join方法t1 = time.time() - startstart = time.time()'''与进程池做对比同样100个任务'''p_list = []for i in range(100):p = Process(target=func,args=(i,))p_list.append(p)p.start()for p in p_list:p.join()t2 = time.time() - startprint(t1,t2)

输出结果:

0.28822946548461914 5.494309902191162

4、p.apply(同步),p.apply_async(异步)调用

from multiprocessing import Pool
import os,time
def func(n):print('start func%s'%n,os.getpid())time.sleep(1)print('end func%s' % n, os.getpid())
if __name__ == '__main__':p = Pool(5)for i in range(10):# p.apply(func,args=(i,))  #同步调用(不好)等待本次进程提交完再提交下一个任务p.apply_async(func, args=(i,))  # 异步调用和主进程完全异步,需要手动close和joinp.close()p.join()

5、获取返回值

from multiprocessing import Pool
import time
def func(i):time.sleep(0.5)return i*iif __name__ == '__main__':p = Pool(5)ret_lst = []for i in range(10):# res = p.apply(func,args=(i,)) #apply的结果就是func的返回值res = p.apply_async(func, args=(i,))  # apply的结果就是func的返回值ret_lst.append(res)for res in ret_lst:print(res.get())  #get():阻塞等待结果

输出结果:

0
1
4
9
16
25
36
49
64
81

map()返回值

from multiprocessing import Pool
import time
def func(i):time.sleep(0.5)return i*iif __name__ == '__main__':p = Pool(5)ret = p.map(func,range(10))print(ret)

输出结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

6、回调函数

import os
from multiprocessing import Pool
def func1(n):print('in func1',os.getpid())return n*ndef func2(nn):print('in func2',os.getpid())print(nn)if __name__ == '__main__':p = Pool(5)p.apply_async(func1,args=(10,),callback=func2)  #fun1的返回值作为回调函func2的参数,然后执行func2p.close()p.join()

输出结果:

支持打印的话会打印(in func1 12333)
in func2 10296
100

二、复习

1、apply:同步的:只有当func执行完后才会继续向下执行其他代码,ret = apply(func,args = ())返回值就是func的return
2、map:自带close,和join,所有的结果是join
3、apply_async:异步的,当func被注册进入一个程序之后,程序就继续向下执行,返回值:apply_async返回的对象obj,为了用户能从中获取func的返回值obj.get(),get会阻塞直到对应的func执行完毕拿到结果;使用apply_async给进程池分配任务;需要先close后join来保持多进程和主进程代码的同步性
4、回调函数:是在主进程中执行的

from multiprocessing import Pool
def func1(n):return n+1
def func2(m):print(m)if __name__ == '__main__':p = Pool(5)for i in range(0,5):p.apply_async(func1,args=(i,),callback=func2)p.close()p.join()

输出结果:

1
2
3
4
5

例1:回调函数爬取数据例子

import requests
from multiprocessing import Pooldef gets(url):ret = requests.get(url)if ret.status_code == 200:return url,ret.content.decode('utf-8')def call_back(args):url,content = argsprint(url,len(content))if __name__ == '__main__':url_list = ['http://www.baidu.com','https://www.csdn.net/','https://www.cnblogs.com/','http://www.sohu.com/',]p = Pool(5)for url in url_list:p.apply_async(gets,args=(url,),callback=call_back)p.close()p.join()

输出结果:

http://www.baidu.com 2287
http://www.sohu.com/ 179481
https://www.cnblogs.com/ 41052
https://www.csdn.net/ 62173

例2:爬取电影信息例子

import re
from urllib.request import urlopen
from multiprocessing import Pooldef get_page(url,pattern):response=urlopen(url).read().decode('utf-8')return pattern,responsedef parse_page(info):pattern,page_content=infores=re.findall(pattern,page_content)for item in res:dic={'index':item[0].strip(),'title':item[1].strip(),'actor':item[2].strip(),'time':item[3].strip(),}print(dic)
if __name__ == '__main__':regex = r'<dd>.*?<.*?class="board-index.*?>(\d+)</i>.*?title="(.*?)".*?class="movie-item-info".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'pattern1=re.compile(regex,re.S)url_dic={'http://maoyan.com/board/7':pattern1,}p=Pool()res_l=[]for url,pattern in url_dic.items():res=p.apply_async(get_page,args=(url,pattern),callback=parse_page)res_l.append(res)for i in res_l:i.get()

输出结果:

{‘index’: ‘1’, ‘title’: ‘海王’, ‘actor’: ‘主演:杰森·莫玛,艾梅柏·希尔德,妮可·基德曼’, ‘time’: ‘上映时间:2018-12-07’}
{‘index’: ‘2’, ‘title’: ‘印度合伙人’, ‘actor’: ‘主演:阿克谢·库玛尔,拉迪卡·艾普特,索娜姆·卡普尔’, ‘time’: ‘上映时间:2018-12-14’}
{‘index’: ‘3’, ‘title’: ‘叶问外传:张天志’, ‘actor’: ‘主演:张晋,戴夫·巴蒂斯塔,柳岩’, ‘time’: ‘上映时间:2018-12-21’}
{‘index’: ‘4’, ‘title’: ‘龙猫’, ‘actor’: ‘主演:秦岚,糸井重里,岛本须美’, ‘time’: ‘上映时间:2018-12-14’}
{‘index’: ‘5’, ‘title’: ‘毒液:致命守护者’, ‘actor’: ‘主演:汤姆·哈迪,米歇尔·威廉姆斯,里兹·阿迈德’, ‘time’: ‘上映时间:2018-11-09’}
{‘index’: ‘6’, ‘title’: ‘无名之辈’, ‘actor’: ‘主演:陈建斌,任素汐,潘斌龙’, ‘time’: ‘上映时间:2018-11-16’}
{‘index’: ‘7’, ‘title’: ‘生活万岁’, ‘actor’: ‘主演:李安甫,胡兆翠,康昕’, ‘time’: ‘上映时间:2018-11-27’}
{‘index’: ‘8’, ‘title’: ‘恐龙王’, ‘actor’: ‘主演:王衡,吕佩玉,孙晔’, ‘time’: ‘上映时间:2018-11-10’}
{‘index’: ‘9’, ‘title’: ‘蜘蛛侠:平行宇宙’, ‘actor’: ‘主演:彭昱畅,沙梅克·摩尔,杰克·M·约翰森’, ‘time’: ‘上映时间:2018-12-21’}
{‘index’: ‘10’, ‘title’: ‘绿毛怪格林奇’, ‘actor’: ‘主演:本尼迪克特·康伯巴奇,卡梅伦·丝蕾,拉什达·琼斯’, ‘time’: ‘上映时间:2018-12-14’}

5、进程池socket应用
server端:

import socket
from multiprocessing import Pooldef func(conn):conn.send(b'hello')ret = conn.recv(1024).decode('utf-8')print(ret)if __name__ == '__main__':p = Pool(5)sk = socket.socket()sk.bind(('127.0.0.1',8080))sk.listen(5)while True:conn, addr = sk.accept()p.apply_async(func,args=(conn,))conn.close()sk.close()

client端:

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))ret = sk.recv(1024).decode('utf-8')
print(ret)
msg = input('>>').encode('utf-8')
sk.send(msg)

python笔记(进程池,爬虫示类)相关推荐

  1. python的进程池map函数_python进程池map

    python进程池怎么实现 当进程池中任务队列非空时,才会触发worker进程去工作,那么如何向进程池中的任务队列中添加任务呢,进程池类有两组关键方法来创建任务,分别是apply/apply_asyn ...

  2. 进程和线程的区别, 面相对象补充, 进程, 数据共享, 锁, 进程池, 爬虫模块(requests, bs4(beautifulsoup))...

    一. 进程和线程的区别?     第一:         进程是cpu资源分配的最小单元.         线程是cpu计算的最小单元.     第二:         一个进程中可以有多个线程.   ...

  3. python 获取进程池 sleeping_Python 进程操作之进程池--Pool

    进程池和multiprocess.Pool模块 1.进程池 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要 ...

  4. python并行计算进程池通信_Python使用进程池管理进程和进程间通信

    与线程池类似的是,如果程序需要启动多个进程,也可以使用进程池来管理进程.程序可以通过 multiprocessing 模块的 Pool() 函数创建进程池,进程池实际上是 multiprocessin ...

  5. python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进程池ftp

    引入进程池 使用ProcessPoolExecutor进程池 使用shutdown 使用submit同步调用 使用submit异步调用 进程池实现ftp 引入进程池 在学习线程池之前,我们先看一个例子 ...

  6. 线程池+进程池爬虫—深圳房价+数据分析+pyecharts可视化

    这一部分转载于自己本人微信公众号: 眼光梭映一世豪,欢迎骚扰!这篇文字只出于想要玩一下数据分析,小白一个,欢迎大家指点批评. 文章目录 01 第一部分,制作缘由. 02第二部分:爬虫的过程 03 第三 ...

  7. python 使用进程池Pool进行并发编程

    进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...

  8. python中进程池的应用

    #原创,转载请联系 假设我们写的一个程序需要运行100个子进程的时候,那么写程序时,不可能循环创建销毁100个进程吧?进程的创建与销毁是很耗系统的资源的. 进程池的作用就体现出来了. 进程池可以控制进 ...

  9. Python 37 进程池与线程池 、 协程

    一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...

最新文章

  1. Gradle 使用技巧(四) - 如何定位和解决依赖冲突
  2. 设计模式——装饰者模式
  3. 学习使用新浪接口随笔(一)
  4. 配置spring事务管理的几种方式(声明式事务)
  5. java不同进程的相互唤醒_JAVA多线程之线程间的通信方式
  6. 升级php5.4 mysql5.5_在CentOS上把PHP从5.4升级到5.5
  7. 人生五大投资,你投对了几个?
  8. csu 1812: 三角形和矩形 凸包
  9. c# mvc如何生成excel
  10. 潜利KINGLEE触摸屏维修喷码机显示屏电脑
  11. 6 个清除 Linux 终端的命令
  12. 局域网查共享计算机的ip地址吗,如何查看电脑的内网IP地址?
  13. 直流无刷电机与永磁同步电机区别
  14. java清除浏览器缓存
  15. MySQL数素数_素数个数-欧拉筛法
  16. 迅捷pdf在线转换html,迅捷PDF在线转换器在线pdf转换jpg步骤方法分享
  17. 西安恒智小寨java_长安反编译工具 java
  18. 课题组亓林博士的论文被 IEEE TGRS 录用
  19. React —— Descriptions(根据自己需求判断要显示哪些)
  20. 安卓模拟器按键_超好用的网易MuMu安卓模拟器(兼容MacOS10.15系统)

热门文章

  1. java Unsafe获取实例详细解析
  2. java unsafe 详解_死磕 java魔法类之Unsafe解析
  3. 【docker】拉取一个基础镜像然后制作自己的镜像并复用
  4. 【Launcher3系列】Android 11 Launcher3 图标替换、定制图标大一圈调整
  5. 委托专利代理机构申请专利的流程
  6. 7-3 打怪升级 单源最短路
  7. 网络安全-域服务器(一)
  8. linux中断初始化程序,Linux x86_64 内核中断初始化
  9. python3解释器执行long(10)的结果为_python3解释器执行d = dict.fromkeys([
  10. 1053 习题4-9-1 判断正整数位数