爬虫之多进程

yuyalinnb   ·   发表于 2022-11-20 00:54:41   ·   学习杂记

0x01 下载多进程包

  1. pip3 install multiprocessing

0x02 Process类说明

  1. multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

Process类: 表示进程对象
group: 一般设置none
target: 一个函数或方法的名字
args: 以元组的方式给执行任务传参
kwargs: 以字典的形式给执行任务传参
创建实例对象后常用方法:
start(): 启动子进程
join(): 等待子进程出结果
terminate(): 不管是否完成,立即终止子进程

0x03 简用

  1. import multiprocessing #导入进程包
  2. import time
  3. def dance():
  4. for i in range(3);
  5. print("跳舞中...")
  6. time.sleep(0.2)
  7. def sing():
  8. for i in range(3);
  9. print("唱歌中...")
  10. time.sleep(0.2)
  11. dance_process = multiprocessing.Process(target=dance)
  12. dance_process.start()
  13. sing()
  14. # 自己手动创建的进程叫做子进程

运行结果:
跳舞中…
唱歌中…
跳舞中…
唱歌中…
跳舞中…
唱歌中…

0x04 获取进程编号

用来验证主进程和子进程的编号,可以得知子进程是哪个主进程创建出来的,如果子进程的父进程正好是主进程的编号,那么这个进程是主进程创建的。

  1. import multiprocessing #导入进程包
  2. import time
  3. import os
  4. #获取当前主进程编号
  5. #查看当前代码是哪个进程执行的
  6. def dance():
  7. dance_process_id = os.getpid()
  8. dance_parent_process_id = os.getppid() print("dance_process_id:",dance_process_idmultiprocessing.current_ process())
  9. for i in range(3);
  10. print("跳舞中...")
  11. time.sleep(0.2)
  12. def sing():
  13. sing_process_id = os.getpid()
  14. sing_parent_process_id = os.getppid() print("sing_process_id:",sing_process_idmultiprocessing.current_ process())
  15. for i in range(3);
  16. print("唱歌中...")
  17. time.sleep(0.2)
  18. dance_process = multiprocessing.Process(target=dance,name="dance")
  19. sing_process = multiprocessing.Process(target=sing,name="sing")
  20. print(dance_process,sing_process)

如果得到的主进程与子进程的父进程相等,那么这个主进程创建了这两个子进程。

  1. for i in range(3);
  2. print("跳舞中...")
  3. time.sleep(0.2)
  4. os.kill(dance_process_id,9)
  5. #杀死进程

0x05 进程执行带有参数的任务

args 元组方式给执行任务传参
kwargs 字典方式给执行任务传参

  1. import multiprocessing
  2. # 显示信息的任务
  3. def show_info(name,age):
  4. print(name,age)
  5. # 创建子进程
  6. sub_process = multiprocessing.Process(target=show_info,args=(20,"cc"))
  7. sub_process.start()
  1. import multiprocessing
  2. # 显示信息的任务
  3. def show_info(name,age):
  4. print(name,age)
  5. # 创建子进程
  6. sub_process = multiprocessing.Process(target=show_info,kwargs={"age":20,"name":'cc'})
  7. sub_process.start()

0x06 进程注意事项

进程之间不共享全局变量

  1. import multiprocessing
  2. import time
  3. g_list = list()
  4. # 定义全局变量列表
  5. def add_data():
  6. for i in range(3) # 列表是可变类型,所以可以在原有内存的基础上修改数据,并且内存地址不变
  7. g_list.append(i)
  8. print("add:",i)
  9. time.sleep(0.2)
  10. # 添加数据的子进程
  11. def read_data():
  12. print("read:",g_list)
  13. add_process = multiprocessing.Process(target=add_data)
  14. read_process = multiprocessing.Process(target=read_data)
  15. # 启动进程执行的对应任务
  16. add_process.start()
  17. add_process.join() # 这时候需要等待添加完成再继续往下执行
  18. read_process.start()

0x07 主进程等待所有子进程结束在结束

  1. import multiprocessing
  2. import time
  3. def task():
  4. for i in range(10):
  5. print("任务执行中...")
  6. time.sleep(0.2)
  7. # 判断是否是直接执行的模块,也就是程序入口模块
  8. # 标准python写法,需要加上判断是否失主模块的代码
  9. if __name__ == '__main__':
  10. # 创建子进程
  11. sub_process = multiprocessing.Process(target=task)
  12. sub_process.start()
  13. # 主进程延迟0.5s
  14. time.sleep(p.5)
  15. print('over')

结论:主进程等待所有子进程结束在结束
解决办法:1、让子进程守护主进程,主进程退出子进程销毁 2、退出主进程之间,先让子进程销毁

打赏我,让我更有动力~

0 条回复   |  直到 2022-11-20 | 343 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.