在使用网络爬虫时,由于线程间共享一个进程,申请的资源是有限的,因此为了更好的并发执行,我们一般使用多进程或进程池提高爬虫效率。以下为学习多进程网络爬虫时的测试代码,主要分为四个部分:一,多进程基础,二,使用子类创建多进程,三,创建进程池,四,使用队列在进程间通信
#使用process子类创建进程
#1.使用SubProcess继承Process类
#2.重写__init__方法(要在其中重写父类的__init__方法,不然父类进程无法创建)
#3.重写run方法
#4.可在主进程中直接对SubProcess对象使用start开启进程(当无target函数时,仅运行子进程中的run方法)
#5.阻塞主进程(等待子进程都执行完)
# from multiprocessing import Process
# import time
# import os
# #继承process类
# class SubProcess(Process):
# #重写父类的__init__方法
# def __init__(self,interval,name=''):
# Process.__init__(self)#调用父类的初始化方法
# self.interval=interval
# #先判断参数name是否存在
# if name:
# self.name=name
# #重写父类的run方法
# def run(self):
# print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(),os.getppid()))
# t_start=time.time()
# time.sleep(self.interval)
# t_end=time.time()
# print("子进程(%s)执行结束,耗时%0.2f秒"%(os.getpid(),t_end-t_start))
# if __name__=="__main__":
# print("……父进程开始执行……")
# print("父进程PID: %s"%os.getpid())
# p1=SubProcess(interval=1,name='mrsoft')
# p2=SubProcess(interval=2)
# #当对一个不包含target属性的Process类执行start方法,就会执行这个类中的run方法(run方法是在子进程中调用)
# #当我们使用Python中的multiprocessing模块来创建多进程时,可以通过继承Process类并重写run()方法来定义进程的行为。
# #在创建一个新进程时,我们需要调用start()方法来启动进程。这个方法会在新的进程中执行run()方法。
# p1.start()
# p2.start()
# print("p1.is_alive=%s"%p1.is_alive())
# print("p2.is_alive=%s"%p2.is_alive())
# print("p1.PID=%s"%p1.pid)
# print("p2.PID=%s"%p2.pid)
# print("p1.name=%s"%p1.name)
# print("p2.name=%s"%p2.name)
# print("……等待子进程……")
# p1.join()
# p2.join()
# print("……父进程执行结束……")
# #使用进程池Pool创建多进程
# #1.创建进程池
# #2.使用进程池调用apply_async方法或apply方法
# #3.关闭进程池
# #4.阻塞主进程
# #阻塞方式,必须等待上一个进程执行完才能执行下一个进程
# #非阻塞方式,可以并行执行多个进程
# #使用非阻塞方式执行10个任务
# from multiprocessing import Pool
# import os
# import time
# def task(name):
# print("子进程(%s)执行task%s "%(os.getpid(),name))
# time.sleep(2)
# if __name__=="__main__":
# print("父进程(%s)"%os.getpid())
# p=Pool(3)#设置开启的并行进程数
# for i in range(10):
# p.apply_async(task,args=(i,))#使用非阻塞方法调用task函数
# print("等待所有子进程结束")
# p.close()#关闭进程池
# p.join()
# print("所有子进程结束")
#进程间通信(通过队列Queue实现)
#在父进程中创建一个队列,再将队列在两个子进程之间传递,实现进程之间的通信
from multiprocessing import Queue
from multiprocessing import Process
import time
#向队列中写入数据
def write_data(q):
if not q.full():
for i in range(3):
message="消息"+str(i)
q.put(message)
print("写入%s"%message)
#向队列中取出数据
def read_data(q):
time.sleep(1)
while not q.empty():
print("读取%s"%q.get(True,2))#等待两秒,若读取不到任何信息则抛出Queue.Empty异常
if __name__=="__main__":
print("……父进程开始……")
q=Queue(3)#初始化一个可储存三个数据的队列
pw=Process(target=write_data,args=(q,))
pr=Process(target=read_data,args=(q,))
pw.start()
pr.start()
pw.join()
pr.join()
print("……父进程结束……")
以上代码基于vscode调试执行,若有错误,希望给予指正!大家一起进步!