Python之多进程与多线程的使用


Posted in Python onFebruary 23, 2021

进程与线程

想象在学校的一个机房,有固定数量的电脑,老师安排了一个爬虫任务让大家一起完成,每个学生使用一台电脑爬取部分数据,将数据放到一个公共数据库。共同资源就像公共数据库,进程就像每一个学生,每多一个学生,就多一个进程来完成这个任务,机房里的电脑数量就像CPU,所以进程数量是CPU决定的,线程就像学生用一台电脑开多个爬虫,爬虫数量由每台电脑的运行内存决定。
一个CPU可以有多个进程,一个进程有一个或多个线程。

多进程

1、导包

from multiprocessing import Process

2、写两个任务
也就是两个函数

3、创建一个进程
进程名字 = Process(target=函数名字,函数参数传字典或元组,是否守护进程)

4、启动进程
进程名字.start()

5、是否开启进程守护,一般主进程会等待子进程执行完毕后再关闭程序。当我们想程序主进程跑完,直接销毁掉未完成的子进程,关闭程序的话,加上一句代码 :
1.创建进程的时候传参数daemon=True
2.进程名字.daemon=True

6、进程编号
导包os
获取当前进程编号

os.getpid()

获取当前父进程的编号

os.getppid()

代码示例(未开启进程守护)

from multiprocessing import Process
import time
import os

# 一个写作业函数
def homeWork(name, count):
  for i in range(count):
    # 打印当前进程编号os.getpid()
    print("当前进程编号:", os.getpid())

    # 打印当前父进程编号os.getppid()
    print("当前父进程编号:", os.getppid())

    print(name, "正在写作业...")
    time.sleep(0.2)
# 一个打游戏函数
def game(name, count):
  for i in range(count):
    # 打印当前进程编号os.getpid()
    print("当前进程编号:", os.getpid())

    # 打印当前父进程编号os.getppid()
    print("当前父进程编号:", os.getppid())

    print(name, "正在打游戏...")
    time.sleep(0.2)

if __name__ == '__main__':
  # 打印当前进程编号os.getpid()
  print("当前进程编号:", os.getpid())

  # 进程1写作业 元组传参
  p1 = Process(target=homeWork, args=("进程1", 10))
  # 进程2打游戏 字典传参
  p2 = Process(target=game, kwargs={"name": "进程2", "count": 10})

  # 启动进程
  p1.start()
  p2.start()
  time.sleep(1)
  print("主进程结束---------------------------------------------")

未开启线程守护的运行结果:

 # 可以看到主进程结束的,其子进程还在继续
当前进程编号: 14972
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
主进程结束---------------------------------------------
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...
当前进程编号: 5732
当前父进程编号: 14972
进程1 正在写作业...
当前进程编号: 14752
当前父进程编号: 14972
进程2 正在打游戏...

Process finished with exit code 0

代码示例(开启进程守护)

from multiprocessing import Process
import time
import os

# 一个写作业函数
def homeWork(name, count):
  for i in range(count):
    # 打印当前进程编号os.getpid()
    print("当前进程编号:", os.getpid())

    # 打印当前父进程编号os.getppid()
    print("当前父进程编号:", os.getppid())

    print(name, "正在写作业...")
    time.sleep(0.2)
# 一个打游戏函数
def game(name, count):
  for i in range(count):
    # 打印当前进程编号os.getpid()
    print("当前进程编号:", os.getpid())

    # 打印当前父进程编号os.getppid()
    print("当前父进程编号:", os.getppid())

    print(name, "正在打游戏...")
    time.sleep(0.2)

if __name__ == '__main__':
  # 打印当前进程编号os.getpid()
  print("当前进程编号:", os.getpid())

  # 进程1写作业 元组传参 第一种方法启动进程守护
  p1 = Process(target=homeWork, args=("进程1", 10), daemon=True)
  # 进程2打游戏 字典传参
  p2 = Process(target=game, kwargs={"name": "进程2", "count": 10})
  # 第二种
  p2.daemon = True
  # 启动进程
  p1.start()
  p2.start()
  time.sleep(1)
  print("主进程---------------------------------------------")

开启进程守护的运行结果

当前进程编号: 372
当前进程编号: 10116
当前进程编号: 9860
当前父进程编号: 372
进程1 正在写作业...
当前父进程编号: 372
进程2 正在打游戏...
当前进程编号: 9860
当前进程编号: 10116
当前父进程编号: 372
进程2 正在打游戏...
当前父进程编号: 372
进程1 正在写作业...
当前进程编号: 9860
当前进程编号: 10116
当前父进程编号: 372
进程1 正在写作业...
当前父进程编号: 372
进程2 正在打游戏...
当前进程编号: 9860
当前进程编号: 10116
当前父进程编号: 372
进程1 正在写作业...
当前父进程编号: 372
进程2 正在打游戏...
主进程结束---------------------------------------------

Process finished with exit code 0

多线程

1、导包

import threading

2、写两个任务
也就是两个函数

3、创建一个线程
线程名字 = threading.Thread(target=函数名字,函数参数传字典或元组,是否守护进程)

4、启动线程
线程名字.start()

5、是否开启线程守护,一般当前程序会等待子线程执行完毕后再关闭程序。当我们想程序跑完,销毁掉未完成的子线程,直接关闭程序的话,加上一句代码 :
1.创建线程的时候传参数daemon=True
2.线程名字.daemon=True

6、线程编号
获取当前线程编号

threading.current_thread()

代码示例(未开启进程守护)

import threading
import time

# 一个写作业函数
def homeWork(name, count):
  for i in range(count):
    # 打印当前线程
    print(threading.current_thread())
    print(name, "正在写作业...")
    time.sleep(0.2)
# 一个打游戏函数
def game(name, count):
  for i in range(count):
    # 打印当前线程
    print(threading.current_thread())
    print(name, "正在打游戏...")
    time.sleep(0.2)

if __name__ == '__main__':

  # 线程1写作业 元组传参
  t1 = threading.Thread(target=homeWork, args=("进程1", 10))
  # 线程2打游戏 字典传参
  t2 = threading.Thread(target=game, kwargs={"name": "进程2", "count": 10})

  # 启动进程
  t1.start()
  t2.start()
  time.sleep(1)
  print("主进程结束###################################################################################")

未开启线程守护的运行结果

 # 可以看到主进程结束的,其线程还在继续
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
主进程结束###################################################################################
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-1, started 3364)>
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...进程1
正在写作业...
<Thread(Thread-1, started 3364)>
进程1 正在写作业...
<Thread(Thread-2, started 9100)>
进程2 正在打游戏...
<Thread(Thread-2, started 9100)><Thread(Thread-1, started 3364)>
进程1
进程2正在写作业...
 正在打游戏...
<Thread(Thread-2, started 9100)><Thread(Thread-1, started 3364)>

进程2 进程1 正在打游戏...
正在写作业...

Process finished with exit code 0

代码示例(开启线程守护)

import threading
import time

# 一个写作业函数
def homeWork(name, count):
  for i in range(count):
    # 打印当前线程
    print(threading.current_thread())
    print(name, "正在写作业...")
    time.sleep(0.2)
# 一个打游戏函数
def game(name, count):
  for i in range(count):
    # 打印当前线程
    print(threading.current_thread())
    print(name, "正在打游戏...")
    time.sleep(0.2)

if __name__ == '__main__':

  # 线程1写作业 元组传参
  t1 = threading.Thread(target=homeWork, args=("进程1", 10), daemon=True)
  # 线程2打游戏 字典传参
  t2 = threading.Thread(target=game, kwargs={"name": "进程2", "count": 10})
  t2.daemon = True

  # 启动进程
  t1.start()
  t2.start()
  time.sleep(1)
  print("主进程结束###################################################################################")

开启线程守护的运行结果

<Thread(Thread-1, started daemon 15480)>
进程1 正在写作业...
<Thread(Thread-2, started daemon 13700)>
进程2 正在打游戏...
<Thread(Thread-2, started daemon 13700)>
进程2 正在打游戏...
<Thread(Thread-1, started daemon 15480)>
进程1 正在写作业...
<Thread(Thread-1, started daemon 15480)><Thread(Thread-2, started daemon 13700)>
进程1
进程2 正在写作业...正在打游戏...

<Thread(Thread-2, started daemon 13700)><Thread(Thread-1, started daemon 15480)>

进程1进程2 正在写作业... 正在打游戏...

<Thread(Thread-1, started daemon 15480)>
进程1 正在写作业...
<Thread(Thread-2, started daemon 13700)>
进程2 正在打游戏...
主进程结束###################################################################################

Process finished with exit code 0

到此这篇关于Python之多进程与多线程的使用的文章就介绍到这了,更多相关Python 多进程与多线程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 用户登录验证的小例子
Mar 06 Python
python如何创建TCP服务端和客户端
Aug 26 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
Python3爬虫学习入门教程
Dec 11 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
python 初始化一个定长的数组实例
Dec 02 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
基于Python 的语音重采样函数解析
Jul 06 Python
用python对excel进行操作(读,写,修改)
Dec 25 Python
python安装mysql的依赖包mysql-python操作
Jan 01 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 #Python
matplotlib grid()设置网格线外观的实现
Feb 22 #Python
浅析python连接数据库的重要事项
Feb 22 #Python
python实现学生信息管理系统源码
Feb 22 #Python
python实现简单的学生管理系统
Feb 22 #Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 #Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 #Python
You might like
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
PHP自定义错误用法示例
2016/09/28 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
wxPython 入门教程
2008/10/07 Python
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
python机器学习实战之K均值聚类
2017/12/20 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python箱型图处理离群点的例子
2019/12/09 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python实现无边框进度条的实例代码
2020/12/30 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
接受捐赠答谢词
2014/01/27 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
地球一小时活动总结
2015/02/27 职场文书
致青春观后感
2015/06/09 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers