python多进程爬虫学习

 在使用网络爬虫时,由于线程间共享一个进程,申请的资源是有限的,因此为了更好的并发执行,我们一般使用多进程或进程池提高爬虫效率。以下为学习多进程网络爬虫时的测试代码,主要分为四个部分:一,多进程基础,二,使用子类创建多进程,三,创建进程池,四,使用队列在进程间通信

 #使用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调试执行,若有错误,希望给予指正!大家一起进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值