requests的作用
通过python来模拟请求网址
一个模拟请求由以下四个部分组成
模拟请求百度
没有安装requests库的同学, 在当前python环境下执行以下语句安装第三方库
pip install requests
import requests
def request_baidu():
url = "https://www.baidu.com/"
# body = ""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
print(response.text)
什么是进程?什么是线程?
多线程demo
from threading import Thread
for i in range(10):
# 只是创建了线程对象
t = Thread(target=request_baidu)
# 启动线程
t.start()
多进程demo
from multiprocessing import Process
for i in range(10):
# 只是创建了进程对象
p = Process(target=request_baidu)
# 启动进程
p.start()
多线程
等待任务完成后回到主进程
通过调用Thread
对象的join
方法
# 保存当前thread对象
thread_array = []
for i in range(10):
t = Thread(target=request_baidu, args=(i, ))
thread_array.append(t)
t.start()
# 调用thread对象join接口, 等待任务完成后回到主进程
for t in thread_array:
t.join()
print("done!")
如何拿到返回结果
赋值到全局变量当中, 添加到可变对象之中
result = []
def request_baidu(index):
...
result.append(response)
if __name__ == "__main__":
thread_array = []
for i in range(10):
t = Thread(target=request_baidu, args=(i, ))
thread_array.append(t)
t.start()
for t in thread_array:
t.join()
print("done!")
print(result)
多进程
等待任务完成后回到主进程
通过调用Process
对象的join
方法
如何拿到返回结果
无法通过全局变量存储返回结果.
多进程相当于启动了多个程序, 共同执行了同一份代码, 他们之间的内存地址完全不一样
import requests
import time
from threading import Thread
from multiprocessing import Process
result = []
print(f"主进程result内存地址: {id(result)}")
def request_baidu(index):
time.sleep(2)
url = "https://www.baidu.com/"
# body = ""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
print(f"当前请求序号: {index}, 返回结果状态码: {response.status_code}")
print(f"子进程result内存地址: {id(result)}")
result.append(response)
# 如果没有判断入口代码段if __name__ == "__main__", 多进程程序会报错
# 原因是windows和pycharm的进程阻塞带来的问题
if __name__ == "__main__":
process_array = []
for i in range(10):
p = Process(target=request_baidu, args=(i, ))
process_array.append(p)
p.start()
for p in process_array:
p.join()
print("done!")
print(result)
多进程和多线程的异同点
cpu
工作时间段的描述, 只是颗粒度不同.
简单地说就是多进程和多线程都会调用cpu
资源的, 但是进程可以启动多个线程去执行.linux
内核态不区分进程和线程ipc
的方式进行.cpu
资源IO
就是input output
, 需要等待的一些任务
Python
程序的字节码(当前代码文件的二进制表示).
简单地说, 创建的10个线程其实在争夺一个cpu
资源. 但是遇到io
操作会让渡cpu
资源.spark
, Apache
PyPy
解释器, 工业上几乎没人这么用, 因为PyPy
并不成熟.