Python之多进程与多线程的使用
作者:我不是秃头哆唻咪 发布时间:2021-01-10 15:03:57
进程与线程
想象在学校的一个机房,有固定数量的电脑,老师安排了一个爬虫任务让大家一起完成,每个学生使用一台电脑爬取部分数据,将数据放到一个公共数据库。共同资源就像公共数据库,进程就像每一个学生,每多一个学生,就多一个进程来完成这个任务,机房里的电脑数量就像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
来源:https://blog.csdn.net/weixin_44864260/article/details/113729547


猜你喜欢
- 正则表达式正则表达式是一种强大的字符串操作工具。它是一种领域特定语言 (DSL),不管是 Python 还是在大多数现代编程语言中都是作为库
- 一、使用三种方法实现0-n累加求和定义函数分别使用while循环、for循环、递归函数实现对0-n的累加求和1、使用while循环定义一个累
- 不管是录入信息时需要用扫码器扫码录入、核对信息时用于扫码识别,还是有别的生成条形码的需要,那我们如何把表格中的数字、文本列快速生成条形码图片
- 在tensorflow中,默认指定占用所有的GPU,如需指定占用的GPU,可以在命令行中:export CUDA_VISIBLE_DEVIC
- 引言我们经常听到"因为GIL的存在,python的多线程不能利用多核CPU",现在我们暂且不提GIL,python能不能
- 有时,在用import导入项目文件夹里自己写的python文件时,常常说找不到该文件,这时可以将项目路径添加到PYTHONPATH下。暂时添
- 太长不看的简洁版本1.x = np.arange(start, end, steps)Values are generated within
- 在Twinsen Liang的博客上看到一篇名为语义化单单的限定在html么?的文章,文中主要是提及了CSS的命名规则,仔细阅读后,我认为这
- 列表转化为字符串如下所示:>>> list1=['ak','uk',4]>>&
- 事件是javascript中的核心内容之一,在对事件的应用中不可避免的要涉及到一个重要的概念,那就是事件冒泡,在介绍事件冒泡之前,先介绍一下
- 一看,C盘只有不到2M可用空间,一查原因,sqlserver安装路径下的log目录文件占了好大,5G多, 于是上网搜了下,解决了: 把与sq
- 本文说明向外扩展数据库系统的两个选项,从而实现更高的可扩展性:水平数据划分和垂直数据划分当我提到向外扩展数据库系统时,我实际上只是讨论对数据
- 需要注意的是:更改完源程序.c文件,需要对整个项目重新编译、make install,对已经生成的文件进行更新,类似于之前VS中在一个类中增
- 最近看了下go发送smtp邮件,于是总结一下简单示例 先上一个最简单的代码 (网上搂的代码改了改)package mainimport (
- 本文实例讲述了Python使用ConfigParser模块操作配置文件的方法。分享给大家供大家参考,具体如下:一、简介用于生成和修改常见配置
- 1.文件的读取操作文件的第一步就是得打开要操作的文件,然后进行读取文件,最后关闭文件。在python中我们可以使用open函数来打开一个文件
- 当你在IE中点击一个Realplayer连接时,系统会自动启动Realplayer软件,不仅占用系统内存,而且在上网时Realplayer容
- 语法df.drop_duplicates(subset = None,
- 本文研究的主要是Python面向对象之继承的相关内容,具体如下。Python 继承即一个派生类(derived class)继承基类(bas
- 从事DBA的行业也有两年多了,在数据备份上无论是理论和实践上,都积