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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
python实现定制交互式命令行的方法
Jul 03 Python
python实现斐波那契递归函数的方法
Sep 08 Python
python中查看变量内存地址的方法
May 05 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
Apr 18 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
关于python 跨域处理方式详解
Mar 28 Python
详解python程序中的多任务
Sep 16 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验证码类(分享)
2013/08/06 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
取得父标签
2006/11/14 Javascript
JS中==与===操作符的比较
2009/03/21 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
vue动态改变背景图片demo分享
2018/09/13 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
python实现百度关键词排名查询
2014/03/30 Python
Python实现简单登录验证
2016/04/13 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
一份python入门应该看的学习资料
2018/04/11 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
利用python实现AR教程
2019/11/20 Python
印尼旅游网站:via
2017/11/12 全球购物
市政施工员自我鉴定
2014/01/15 职场文书
财务工作失职检讨书
2014/11/21 职场文书
实习指导老师意见
2015/06/04 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android
详解flex:1什么意思
2022/07/23 HTML / CSS
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python