URL管理器:管理待爬取的url集合和已爬取的url集合,传送待爬取的url给网页下载器。
网页下载器(urllib):爬取url对应的网页,存储成字符串,传送给网页解析器。
网页解析器(BeautifulSoup):解析出有价值的数据,存储下来,同时补充url到URL管理器。
Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据。
urllib.request库
from urllib import request
headers = { 'User-Agent': 'Mozilla/5.0 Chrome/64.0.3282.186 Safari/537.36', }
url = 'http://www.baidu.com'
req = request.Request(url, headers=headers)
response = request.urlopen(req)
data = response.read().decode('UTF-8')
print(data)
一,获取整个页面数据一,获取整个页面数据一,获取整个页面数据一,获取整个页面数据一,获取整个页面数据一,获取整个页面数据
#coding=utf-8
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
html = getHtml("http://tieba.baidu.com/p/2738151262")
print html
首先,我们定义了一个getHtml()函数:
urllib.urlopen()方法用于打开一个URL地址。
read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
二,筛选页面中想要的数据二,筛选页面中想要的数据二,筛选页面中想要的数据二,筛选页面中想要的数据二,筛选页面中想要的数据
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
return imglist
html = getHtml("http://tieba.baidu.com/p/2460150866")
print getImg(html)
我们又创建了getImg()函数,用于在获取的整个页面中筛选需要的图片连接。re模块主要包含了正则表达式:
re.compile() 可以把正则表达式编译成一个正则表达式对象.
re.findall() 方法读取html 中包含 imgre(正则表达式)的数据。
运行脚本将得到整个页面中包含图片的URL地址。
三,将页面筛选的数据保存到本地三,将页面筛选的数据保存到本地三,将页面筛选的数据保存到本地三,将页面筛选的数据保存到本地
把筛选的图片地址通过for循环遍历并保存到本地,代码如下:
#coding=utf-8
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
x+=1
return imglist
html = getHtml("http://tieba.baidu.com/p/2460150866")
print getImg(html)
************************https://www.cnblogs.com/zhaof/p/6910871.html
************************https://www.cnblogs.com/zhaof/tag/%E7%88%AC%E8%99%AB/
URL解析函数的重点是将URL字符串拆分为其组件,或者将URL组件组合为一个URL字符串。
urllib.parse。urlparse(allow_fragments urlstring方案=”= True)
urlunpars
其实功能和urlparse的功能相反,它是用于拼接
urljoin
这个的功能其实是做拼接的
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com', 'FAQ.html'))
print(urljoin('http://www.baidu.com', 'https://pythonsite.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html?question=2'))
print(urljoin('http://www.baidu.com?wd=abc', 'https://pythonsite.com/index.php'))
print(urljoin('http://www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com#comment', '?category=2'))
[Requests]
**************************https://www.cnblogs.com/tangdongchu/p/4229049.html
Requests
Requests模块安装 pip install requests
HTTP请求类型
get类型
r = requests.get('https://github.com/timeline.json')
post类型
r = requests.post("http://m.ctrip.com/post")
put类型
r = requests.put("http://m.ctrip.com/put")
delete类型
r = requests.delete("http://m.ctrip.com/delete")
head类型
r = requests.head("http://m.ctrip.com/head")
options类型
r = requests.options("http://m.ctrip.com/get")
获取响应内容
print r.content #以字节的方式去显示,中文显示为字符
print r.text #以文本的方式去显示
URL传递参数
payload = {'keyword': '日本', 'salecityid': '2'}
r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)
print r.url #示例为http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=日本
获取/修改网页编码
r = requests.get('https://github.com/timeline.json')
print r.encoding
r.encoding = 'utf-8'
json处理
r = requests.get('https://github.com/timeline.json')
print r.json() #需要先import json
定制请求头
url = 'http://m.ctrip.com'
headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
r = requests.post(url, headers=headers)
print r.request.headers
复杂post请求
url = 'http://m.ctrip.com'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload)) #如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下
post多部分编码文件
url = 'http://m.ctrip.com'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
响应状态码
r = requests.get('http://m.ctrip.com')
print r.status_code
响应头
r = requests.get('http://m.ctrip.com')
print r.headers
print r.headers['Content-Type']
print r.headers.get('content-type') #访问响应头部分内容的两种方式
Cookies
url = 'http://example.com/some/cookie/setting/url'
r = requests.get(url)
r.cookies['example_cookie_name'] #读取cookies
url = 'http://m.ctrip.com/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies) #发送cookies
设置超时时间
r = requests.get('http://m.ctrip.com', timeout=0.001)
设置访问代理
proxies = {
"http": "http://10.10.10.10:8888",
"https": "http://10.10.10.100:4444",
}
r = requests.get('http://m.ctrip.com', proxies=proxies)
任务队列TaskQueue
TaskQueue的中文翻译是“任务队列”,顾名思义,它的作用就是把一些“任务”存储在队列中,
然后再从队列中取出任务并执行。由于队列是FIFO(先进先出),所以任务队列具有有序性。
该功能包括两个类:Task任务类,TaskQueue任务队列类
其中TaskQueue负责:
1、开始任务
2、添加任务
3、清空任务
4、开始任务回调
5、完成队列中所有任务回调
6、下一个任务
7、当前任务进度
8、队列存储所有任务
python队列Queue
Queue
Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,
即队列,用来在生产者和消费者线程之间的信息传递
基本FIFO队列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先进先出。
Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。
一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个
NoSuchElementException异常
task_done()
意味着之前入队的一个任务已经完成。由队列的消费者线程调用。
每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。
如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。
join()
阻塞调用线程,直到队列中的所有任务被处理掉。
只要有数据被加入队列,未完成的任务数就会增加。
当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。
当未完成的任务数降到0,join()解除阻塞。
put(item[, block[, timeout]])
将item放入队列中。
1.如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
2.如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
3.如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常
其非阻塞版本为put_nowait等同于put(item, False)
empty()
如果队列为空,返回True,反之返回Fals
python——BeautifulSoup库函数find_all()
find_all( name , attrs , recursive , string , **kwargs )
find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
Pool :
pool = pool.Pool(2)
变量 几个进程
功能:创建进程池;
参数: processes 进程池中进程的数量;
apply_async()
功能: 将异步的方式要执行的事件放入进程池;
参数:
func 要执行的函数
args 给函数按位置传参
kwds 给函数按照键值传参
返回值: 返回事件执行后的返回值对象,可以通过调用get()函数获取事件函数return的内容;get() 函数获取事件函数return内容;
close()
功能:关闭进程池,使其不能再加入新的事件;
#!/usr/bin/python3
import multiprocessing as mp
from time import sleep
import os
def worker(msg):
sleep(2)
print(msg)
return 'worker msg' + msg
创建进程池对象,进程池中包含4个进程
pool = mp.Pool(processes = 4)
result = []
for i in range(10):
msg = 'hello %d'%i
#像进程池加入要执行的事件
r = pool.apply_async(worker,(msg,))
#pool.apply(worker,(msg,))
result.append(r)
print(result)
获取每个事件函数的返回值
for res in result:
print(res.get())
#关闭进程池事件加入通道,即不能再向进程池中加入事件
pool.close()
#塞等待进程池出来事件结束后回收进程池
pool.join()
创建自己的进程类;
1, 继承Process类以获取原有的属性
2,实现自己需要的功能部分;
3,使用自己的类创建进程即可;
from multiprocessing import Process
import time
class ClockProcess(Process):
def __init__(self, *args, **kwargs):
Process.__init__(self)
self.value = value
#在proces类中实现,现在重写这个函数
def run(self):
n = 5
while n > 0:
print('The time is {}'.\
format(time.ctime()))
time.sleep(self.value)
n -= 1
#s使用自己的进程类创建进程对象
p = ClockProcess(2)
#start后会自动执行run函数
p.start()
p.join()
Cookie
https://www.cnblogs.com/alamZ/p/7407007.html
https://www.cnblogs.com/adc8868/p/7256078.htmls
Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
Cookie原理
HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性,包括:
Cookie名字(Name)
Cookie的值(Value)
Cookie的过期时间(Expires/Max-Age)
Cookie作用路径(Path)
Cookie所在域名(Domain),
使用Cookie进行安全连接(Secure)。
前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。
Cookie由变量名和值组成,根据 Netscape公司的规定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
Cookie应用
Cookies在爬虫方面最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续。
获取一个有登录信息的Cookie模拟登陆
import urllib2
# 1. 构建一个已经登录过的用户的headers信息
headers = {
"Host":"www.renren.com",
"Connection":"keep-alive",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",
# 便于终端阅读,表示不支持压缩文件
# Accept-Encoding: gzip, deflate, sdch,
# 重点:这个Cookie是保存了密码无需重复登录的用户的Cookie,这个Cookie里记录了用户名,密码(通常经过RAS加密)
"Cookie": "anonymid=ixrna3fysufnwv; depovince=GW; _r01_=1; JSESSIONID=abcmaDhEdqIlM7riy5iMv; jebe_key=f6fb270b-d06d-42e6-8b53-e67c3156aa7e%7Cc13c37f53bca9e1e7132d4b58ce00fa3%7C1484060607478%7C1%7C1484060607173; jebecookies=26fb58d1-cbe7-4fc3-a4ad-592233d1b42e|||||; ick_login=1f2b895d-34c7-4a1d-afb7-d84666fad409; _de=BF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; p=99e54330ba9f910b02e6b08058f780479; ap=327550029; first_login_flag=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn521/20140529/1055/h_main_9A3Z_e0c300019f6a195a.jpg; t=214ca9a28f70ca6aa0801404dda4f6789; societyguester=214ca9a28f70ca6aa0801404dda4f6789; id=327550029; xnsid=745033c5; ver=7.0; loginfrom=syshome"
}
# 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象
urllib2.Request("http://www.renren.com/", headers = headers)
# 3. 直接访问renren主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户,并返回相应的页面
response = urllib2.urlopen(request)
# 4. 打印响应内容
print response.read()
通常,我们使用Request和Response对象来直接操作 Cookies:
写入Cookies:
Response.Cookies["k1"].Value = "k1Value";
Response.Cookies["k2"]["k2-1"] = "k2-1Value";
Response.Cookies.Add(new HttpCookie("k3", "k3Value"));
读取Cookies:
Request["k1"] ;
Request.Cookies["k1"].Value ;
Request.Cookies["k2"]["k2-1"];
Request.Cookies.Get(0).Value;
注意Request["k1"]这个大家熟悉的获取get和post参数的方法,同时还能够获取Cookies的值!
另外上面语句中的有些是必须通过Value属性访问的,有些则不需要。
Cookies的Path属性
Cookies的Path属性表示当前的Cookies可以作用在网站的那个路径下。
python学习之——selenium元素定位
from selenium import webdriver
定位和操作节点
driver.find_element_by_xpath()#根据xpath路径定位标签(找单个)
driver.find_elements_by_xpath()#根据xpath路径定位标签(找所有)
driver.find_element_by_css_selector()#根据css选择器定位标签
driver.find_element_by_link_text()#根据标签文本内容(完整)
driver.find_elements_by_partial_link_text()#根据标签文本内容(局部)
driver.find_element_by_id()#根据id属性寻找节点
driver.find_element_by_class_name()#根据class属性寻找节点
Xpath
XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历.
XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.
XPath是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等.
在学习XPath之前你应该对XML的节点,元素,属性,原子值(文本),处理指令,注释,根节点(文档节点),命名空间以及对节点间的关系如:父(Parent),子(Children),兄弟(Sibling),先辈(Ancestor),后代(Descendant)等概念有所了解.
XML? from lxml import etree tag方法可以获取标签名
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 的标签需要我们自行定义。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
路径表达式:
表达式 描述
nodename 选取此节点的所有子节点.
/ 从根节点选取.
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置.
. 选取当前节点.
.. 选取当前节点的父节点.
@ 选取属性.
Selenium
Selenium是自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器
selenium:是一个web的自动化测试工具,可以直接运行在浏览器上,但是并不自带浏览器,需要有浏览器驱动,selenium可以根据我们的代码指令,
让浏览器自动加载页面,这时得到的页面源码是经过浏览器渲染之后的,然后我们就可以在页面源码中寻找节点(动态加载的网页,模拟登录)
1.安装 pip install selenium
- from selenium import webdriver
XXXX = webdriver.Chrome()
XXXX.get('http://www.baidu.com/')
3.定位和操作节点
driver.find_element_by_xpath()#根据xpath路径定位标签(找单个)
driver.find_elements_by_xpath()#根据xpath路径定位标签(找所有)
driver.find_element_by_css_selector()#根据css选择器定位标签
driver.find_element_by_link_text()#根据标签文本内容(完整)
driver.find_elements_by_partial_link_text()#根据标签文本内容(局部)
driver.find_element_by_id()#根据id属性寻找节点
driver.find_element_by_class_name()#根据class属性寻找节点
4.页面的相关操作:
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框如下:
<input type="text" name="user-name" id="passwd-id">
1).获取id标签值
element = driver.find_element_by_id("passwd-id")
2).获取name标签值
element = driver.find_element_by_name("user-name")
3).获取标签名值
element = driver.find_elements_by_tag_name("input")
4).也可以通过XPath来匹配
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
Cookies操作
获取页面每个Cookies值,用法如下
cookies = driver.get_cookies()
cookie_dict = {i['name']:i['value'] for i in cookies}
print(cookie_dict)
添加cookies
driver.add_cookie(cookie_dict)
删除Cookies,用法如下
删除一个特定的cookie
driver.delete_cookie("CookieName")
删除所有cookie
driver.delete_all_cookies()
beautifulsoup
from bs4 import BeautifulSoup
Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。
它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。它可以大大节省你的编程时间。
soup 就是BeautifulSoup处理格式化后的字符串,
soup.title 得到的是title标签,soup.p得到的是文档中的第一个p标签,要想得到所有标签,得用find_all函数。
find_all 函数返回的是一个序列,可以对它进行循环,依次得到想到的东西.
get_text() 是返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的
四大对象种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
Tag
NavigableString
BeautifulSoup
Comment
pyquery
from pyquery import PyQuery as pq
安装 pip3 install pyquery
注意:由于 pyquery 依赖于 lxml ,要先安装 lxml ,否则会提示失败。
pip3 install lxml
1、.html()和.text() 获取相应的 HTML 块或者文本内容,
2、(selector):通过选择器来获取目标内容,
3、.eq(index):根据索引号获取指定元素(index 从 0 开始)
4、.find():查找嵌套元素,
5、.filter():根据 class、id 筛选指定元素,
6、.attr():获取、修改属性值,
7、其他操作:
#添加 class
.addClass(value):
#判断是否包含指定的 class,返回 True 或 False
.hasClass(value):
#获取子元素
.children():
#获取父元素
.parents():
#获取下一个元素
.next():
#获取后面全部元素块
.nextAll():
#获取所有不匹配该选择器的元素
.not_(selector):
re 正则表达式
爬虫一共就四个主要步骤:
1).明确目标 (要知道你准备在哪个范围或者网站去搜索)
2).爬 (将所有的网站的内容全部爬下来)
3).取 (去掉对我们没用处的数据)
4).处理数据(按照我们想要的方式存储和使用
目的 给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1.给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):
2.可以通过正则表达式,从字符串中获取我们想要的特定部分。
python模块下的正则表达式
Python 的 re 模块
compile 函数
compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:
import re
**将正则表达式编译成 Pattern 对象**
pattern = re.compile(r'\d+')
用pattern的方法对文本进行匹配查找
。match 方法:从起始位置开始查找,一次匹配
。search 方法:从任何位置开始查找,一次匹配
。findall 方法:全部匹配,返回列表
。finditer 方法:全部匹配,返回迭代器
。split 方法:分割字符串,返回列表
。sub 方法:替换
amatch 只是查找字符串的头部(也可以查找制定的位置)
。只是匹配一次,只要匹配到结果就会返回,不会查找全部结果
*******************************https://www.cnblogs.com/yeayee/p/4952022.html
多线程
python提供了两个模块来实现多线程thread 和threading
thread 有一些缺点,在threading 得到了弥补学习threading
threading.Thread参数介绍
target:线程执行的函数
name:线程名称
args:执行函数中需要传递的参数,元组类型 另外:注意daemon参数
1.线程
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用
2.多线程执行
import threading 首先导入threading 模块,这是使用多线程的前提。
split()可以将一个字符串拆分成两部分,然后取其中的一部分。
多线程爬虫
Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;
队列是线程间最常用的交换数据的形式
1.初始化: class (FIFO 先进先出)
Queue.Queue(maxsize)
2.包中的常用方法:
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应
Queue.get(block,timeout)获取队列,timeout等待时间
创建一个“队列”对象
import Queue
myqueue = Queue.Queue(maxsize = 10)
4.将一个值放入队列中
myqueue.put(10)
将一个值从队列中取出
myqueue.get()
多进程
1.进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。不仅可以通过线程完成多任务,进程也是可以的
2.进程的状态
工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态
3.进程的创建-multiprocessing
multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情
4. Process参数如下:
Process(group, target, name, args , kwargs)
target:如果传递了函数的引用,可以任务这个子进程就执行这里的代码
args:给target指定的函数传递的参数,以元组的方式传递
kwargs:给target指定的函数传递命名参数
name:给进程设定一个名字,可以不设定
group:指定进程组,大多数情况下用不到
Process创建的实例对象的常用方法:
start():启动子进程实例(创建子进程)
is_alive():判断进程子进程是否还在活着
join([timeout]):是否等待子进程执行结束,或等待多少秒
terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
pid:当前进程的pid(进程号)
进程池Pool
multiprocessing.Pool常用函数解析:
apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
**********************https://www.cnblogs.com/TankMa/archive/2011/06/08/2074947.html