●模拟请求百度
import requests
def request_baidu():
time.sleep(1)
url = "https://www.baidu.com/"
body = ""
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
print(response)
●什么是进程?什么是线程?
。进程:可以简单地认为是一一个程序进程是操作系统分配资源的最小单位.
。线程:一个进程可以有多个线程每个线程可以立完成一些任务.线程是操作系统进行运算调度的最小单位
●多线程demo
from threading import Thread
for i in range(10):
#创建线程对象
t = Thread(target=request_baidu, args=(i,)) #将参数作为元组传递给args参数
t.start()
●多进程demo
from multiprocessing import Process
for i in range(10):
#创建进程对象
p = Process(target=request_baidu, args=(i,)) #将参数作为元组传递给args参数
p.start()
●多线程
。等待任务完成之后回到主进程
■通过调用Thread对象的join方法
thread_array = []
for i in range(10):
#创建线程对象
t = Thread(target=request_baidu, args=(i,)) #将参数作为元组传递给args参数
thread_array.append(t)
t.start()
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方法
thread_array = []
for i in range(10):
#创建线程对象
t = Process(target=request_baidu, args=(i,)) #将参数作为元组传递给args参数
thread_array.append(t)
t.start()
for t in thread_array:
t.join()
print("done!")
。如何拿到返回结果
无法通过全局变量存储返回结果
多进程相当于启动了多个程序,共同执行了同一份代码,他们之间的内存地址完全不一样
import requests
import time
from threading import Thread
from multiprocessing import Process
result = []
print(f"主进程result内存地址:{id(result)}")
def request_baidu(index):
time.sleep(1)
url = "https://www.baidu.com/"
body = ""
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
result.append(response)
print(f"当前请求序号: {index}, 返回结果状态码: {response.status_code}")
print(id(result))
if __name__ == "__main__":
thread_array = []
for i in range(10):
# request_baidu()
#创建进程
t = Process(target=request_baidu, args=(i,)) #将参数作为元组传递给args参数
thread_array.append(t)
# 创建线程
# t = Thread(target=request_baidu)
t.start()
for t in thread_array:
t.join()
print("done!")
print(result)
#如果没有判断入口代码if __name__ == "__main__": 多进程程序会报错。
原因是是windows 和pycharm的进程阻塞带来的问题
●多进程和多线程的异同点
。相同点
■都是对cpu工作时间段的描述只是颗粒度不同。
简单地说就是多进程和多线程都会调用cpu资源的但是进程可以启动多个线程去执行.
■在Linux内核态不区分进程和线程
。不同点
■进程有自己的独立地址空间建立数据表来维护代码段.堆栈段和数据段,而线程共享进程中的资源使用相同的地址空间所以线程间的切换快得多.
■因为线程共享进程的全局变量,静态变量等对象线程间的通信更为方便,而进程间的通信更加复杂需要以IPC(进程之间的通信)的方式进行.
■多进程要比多线程要健壮,进程之间一般不会相互影响,而多线程有一条线程崩溃, 会导致整个进程跟着发生崩溃或者无法正常退出等.