目录
1.单进程
import time
def run1():
print('我是run函数')
# 当前代码阻塞在这了 卡在这了
time.sleep(1000)
def run2():
print('我是run函数')
# 当前代码阻塞在这了 卡在这了
time.sleep(1000)
run1()
run2()
print('我是下面的代码')
2.多进程
import time
from multiprocessing import Process
def run1():
for i in range(500):
print('我是run1函数')
# 当前代码阻塞在这了 卡在这了
time.sleep(1)
def run2():
for i in range(500):
print('我是run2函数')
# 当前代码阻塞在这了 卡在这了
time.sleep(1)
if __name__ == '__main__':
t1 = time.time()
p1 = Process(target=run1) # 创建子进程p1
p2 = Process(target=run2) # 创建子进程p2
p1.start() # 开启p1子进程
p2.start() # 开启p2子进程
p1.join() # 阻塞等待 p1子进程执行完 主进程在等待子进程干活啊
p2.join() # 阻塞等待 p2 子进程执行完
print('主进程')
time.sleep(1000)
print('我是下面的代码')
print(time.time() - t1)
3、多进程传参
from multiprocessing import Process
# def run1(num, name):
def run1(num, name='lucky'):
for i in range(num):
print(f'我是{name}函数')
# 当前代码阻塞在这了 卡在这了
if __name__ == '__main__':
# 元祖的效率高于列表
# 注意 传递参数args如果为一个值 则需给逗号,1为run1执行的次数
Process(target=run1, args=(1,)).start()
# Process(target=run1, args=[1]).start()
# Process(target=run1, args=(1, )).start()
# Process(target=run1, args=(1, 'lucky')).start()
# 如果传递参数args为一个值,且没加逗号,将报下面错误
# TypeError: 'int' object is not iterable
# for i in 1:
# pass
# TypeError: 'int' object is not iterable
4、多进程变量共享
"""
num = 1
def run1():
# 声明num为全局变量
global num
num = 2 # 更改全局变量num的值为2
print('我是run1函数', num)
run1()
print(num)
# 输出:我是run1函数 2
# 2
"""
List = []
def run1():
List.append('luckyboy')
print('我是run1函数', List)
run1()
print(List)
# 输出:我是run1函数 ['luckyboy']
# ['luckyboy']
from multiprocessing import Process
num = 1
def run1():
# 声明num为全局变量
global num
num = 2 # 更改全局变量num的值为2
print('我是run1函数', num)
if __name__ == '__main__':
Process(target=run1).start()
print('over')
print(num) # 1 进程间是独立的 每个进程有自己的独立存储
5、进程通信队列
from multiprocessing import Process, Queue
def run(que):
# 将数据放进队列中
print('子进程放数据')
que.put(1)
que.put(2)
que.put(3)
if __name__ == '__main__':
# 创建队列对象
que = Queue()
# 这里传参args的参数que给run
p = Process(target=run, args=(que, ))
p.start()
p.join()
print('主进程获取数据', que.get())
print('主进程获取数据', que.get())
print('主进程获取数据', que.get())
# 如果队列中没有数据了 会阻塞等待
# print('主进程获取数据', que.get())
# 如果在timeout时间内 还没有数据 跑出异常
# print('主进程获取数据', que.get(timeout=3))
# 输出:子进程放数据
# 主进程获取数据 1
# 主进程获取数据 2
# 主进程获取数据 3
6、进程通信字典
from multiprocessing import Process, Queue, Manager
def run(Dict):
# 将数据放进队列中
print('子进程放数据')
Dict['name'] = 'luckyboy'
Dict['age'] = '18'
if __name__ == '__main__':
# 创建队列对象
Dict = Manager().dict()
p = Process(target=run, args=(Dict, ))
p.start()
p.join()
print('主进程获取数据', Dict)
# 输出:子进程放数据
# 主进程获取数据 {'name': 'luckyboy', 'age': '18'}
7、进程通讯列表
from multiprocessing import Process, Manager
def run(List):
# 将数据放进队列中
print('子进程放数据')
List.append('luckyboy')
List.append(18)
if __name__ == '__main__':
# 创建队列对象
List = Manager().list()
p = Process(target=run, args=(List, ))
p.start()
p.join()
print('主进程获取数据', List)
# 输出:子进程放数据
# 主进程获取数据 ['luckyboy', 18]
8、多个子进程
import time
from multiprocessing import Process
def get_data(url):
# 请求爬取数据
# requests.get(url)
# print(new_url)
print(url)
time.sleep(1)
if __name__ == '__main__':
# 爬取10页数据
url = 'http://www.baidu.com?page='
start = time.time()
# print('开始时间:' , start)
for i in range(10):
new_url = url + str(i)
Process(target=get_data, args=(new_url,)).start()
# 输出:http://www.baidu.com?page=0
# http://www.baidu.com?page=1
# http://www.baidu.com?page=2
# http://www.baidu.com?page=3
# http://www.baidu.com?page=4
# http://www.baidu.com?page=5
# http://www.baidu.com?page=6
# http://www.baidu.com?page=7
# http://www.baidu.com?page=8
# http://www.baidu.com?page=9
9、进程池
import time
from multiprocessing import Pool, cpu_count
def get_data(url):
# 请求爬取数据
# requests.get(url)
# print(new_url)
print('子进程开始', url)
time.sleep(10)
print('子进程结束', url)
if __name__ == '__main__':
# 爬取10页数据
# 注意
# 自己练习抓取数据的时候 别给好几个进程 容易给网站跑死
url = 'http://www.baidu.com?page='
# pool = Pool() # 传参 开启几个进程 默认开启核心数个cpu
pool = Pool(2) # 传参2 开启2个进程 默认开启核心数个cpu
for i in range(6):
url = 'http://www.baidu.com?page='+str(i)
# 任务添加到进程池
pool.apply_async(get_data, args=(url, ))
pool.close() # 关闭池子 不在放进程了
pool.join() # 阻塞等待
print('主进程结束')
print(cpu_count()) # 打印电脑的核心数
# 输出:
# 子进程开始 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=1
# 子进程结束 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=2
# 子进程结束 http://www.baidu.com?page=1
# 子进程开始 http://www.baidu.com?page=3
# 子进程结束 http://www.baidu.com?page=2
# 子进程开始 http://www.baidu.com?page=4
# 子进程结束 http://www.baidu.com?page=3
# 子进程开始 http://www.baidu.com?page=5
# 子进程结束 http://www.baidu.com?page=4
# 子进程结束 http://www.baidu.com?page=5
# 主进程结束
# 4
10、进程池map
import time
from multiprocessing import Pool, cpu_count
def get_data(url):
# 请求爬取数据
# requests.get(url)
# print(new_url)
print('子进程开始', url)
time.sleep(10)
print('子进程结束', url)
if __name__ == '__main__':
# 爬取10页数据
# 注意
# 自己练习抓取数据的时候 别给好几个进程 容易给网站跑死
url = 'http://www.baidu.com?page='
# pool = Pool() # 传参 开启几个进程 默认开启核心数个cpu
pool = Pool(3) # 传参 开启几个进程 默认开启核心数个cpu
url_list = []
for i in range(5):
url = 'http://www.baidu.com?page='+str(i)
url_list.append(url)
pool.map(get_data, url_list)
# 输出:
# 子进程开始 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=1
# 子进程开始 http://www.baidu.com?page=2
# 子进程结束 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=3
# 子进程结束 http://www.baidu.com?page=1
# 子进程开始 http://www.baidu.com?page=4
# 子进程结束 http://www.baidu.com?page=2
# 子进程结束 http://www.baidu.com?page=3
# 子进程结束 http://www.baidu.com?page=4
11、多进程爬取肯德基门店信息
import urllib.request
import urllib.parse
import json
from multiprocessing import Process
def kfc(num):
# 拿到地址
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers = {
'User-Agent':' Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
print(f'第{num}页数据')
# 获取到当前浏览器请求所携带的表单数据
formData = {
'cname': '',
'pid': '',
'keyword': '北京',
'pageIndex': num,
'pageSize': 10,
}
# 对表单数据进行转码
formData = urllib.parse.urlencode(formData).encode('UTF-8')
# 发送post请求
request = urllib.request.Request(url, data=formData, headers=headers)
response = urllib.request.urlopen(request)
# 返回json数据 转换成字典
data = json.loads(response.read().decode('UTF-8'))
# print(data['Table1'])
for l in data['Table1']:
print(l)
if __name__ == '__main__':
for i in range(1, 10):
Process(target=kfc, args=(i,)).start()